当前位置: 首页 > 编程语言 > C#

将数字加密到另一个相同长度的数字分享

时间:2023-04-10 23:35:32 C#

C#学习教程:将一个数字加密成另一个相同长度的数字除了0123456789之外没有其他字符)。稍后我需要能够将加密数字解密回原始数字。重要的是,这2个加密数字是否按顺序排列并不明显。因此,例如,如果我加密0000000000001,它在加密后看起来应该与000000000002完全不同。它不一定是世界上最安全的东西,但越安全越好。我一直在四处寻找,但没有找到任何看起来很合适的东西。据我所知,某种类型的XOR可能是最简单的方法,但我不知道该怎么做。谢谢,吉姆,我终于解决了这个问题,感谢你们使用维基百科页面http://en.wikipedia.org/wiki/Format-preserving_encryption中的“来自前缀密码的FPE”。我将在下面给出基本步骤,希望它能帮助将来的人。注意-我相信任何专家都会告诉你这是一个hack。这些数字似乎是随机的,足以满足我的需要,但如果安全是一个大问题,请使用其他东西。我相信专家可以指出我所做的。发布这个的唯一目的是因为我会发现它在搜索我的问题的答案时很有用。也只有在无法反编译时才使用它。本来打算贴出步骤的,但是解释太多了。我只是发布我的代码。这是我仍然需要清理的概念验证代码,但你会明白的。请注意,我的代码是特定于12位数字的,但对于其他人来说应该很容易调整。Max可能像我一样是16岁。publicstaticstringDoEncrypt(stringunencryptedString){stringencryptedString="";unencryptedString=newstring(unencryptedString.ToCharArray().Reverse().ToArray());foreach(charcharacterinunencryptedString.ToCharArray()){stringrandomizationSeed=(encryptedString.Length>0)?unencryptedString.Substring(0,encryptedString.Length):"";encryptedString+=GetRandomSubstitutionArray(randomizationSeed)[int.Parse(character.ToString())];}返回随机播放(加密字符串);}publicstaticstringDoDecrypt(stringencryptedString){//首先解开字符串以使处理更容易。encryptedString=Unshuffle(encryptedString);字符串unencryptedString="";foreach(charcharacterinencryptedString.ToCharArray().ToArray())unencryptedString+=GetRandomSubstitutionArray(unencryptedString).IndexOf(int.Parse(character.ToString()));//反转字符串,因为加密字符串在处理时被反转。返回新字符串(未加密String.ToCharArray().Reverse().ToArray());}privatestaticstringShuffle(stringunshuffled){char[]unshuffledCharacters=unshuffled.ToCharArray();char[]shuffledCharacters=newchar[12];洗牌字符[0]=未洗牌字符[2];shuffledCharacters[1]=unshuffledCharacters[7];shuffledCharacters[2]=unshuffledCharacters[10];shuffledCharacters[3]=unshuffledCharacters[5];shuffledCharacters[4]=unshuffledCharacters[3];shuffledCharacters[5]=unshuffledCharacters[1];洗牌字符[6]=未洗牌字符[0];shuffledCharacters[7]=unshuffledCharacters[4];shuffledCharacters[8]=unshuffledCharacters[8];shuffledCharacters[9]=unshuffledCharacters[11];洗牌字符[10]=未洗牌字符[6];shuffledCharacters[11]=unshuffledCharacters[9];返回新字符串(随机字符);}privatestaticstringUnshuffle(stringshuffled){char[]shuffledCharacters=shuffled.ToCharArray();char[]unshuffledCharacters=新字符[12];unshuffledCharacters[0]=shuffledCharacters[6];unshuffledCharacters[1]=shuffledCharacters[5];unshuffledCharacters[2]=shuffledCharacters[0];unshuffledCharacters[3]=shuffledCharacters[4];unshuffledCharacters[4]=shuffledCharacters[7];unshuffledCharacters[5]=shuffledCharacters[3];unshuffledCharacters[6]=shuffledCharacters[10];unshuffledCharacters[7]=shuffledCharacters[1];unshuffledCharacters[8]=shuffledCharacters[8];unshuffledCharacters[9]=shuffledCharacters[11];unshuffledCharacters[10]=shuffledCharacters[2];unshuffledCharacters[11]=shuffledCharacters[9];返回新字符串(unshuffledCharacters);}publicstaticstringDoPrefixCipherEncrypt(stringstrIn,byte[]btKey){if(strIn.LengthGetRandomSubstitutionArray(stringnumber){//根据需要填充数字以获得更长的密钥长度和更随机的种子。//注意我不想使这里的代码可用,清理起来会花费更长的时间,所以我我告诉你我做了什么。我基本上获取了传入的每个数字种子并为其添加前缀和后缀一些值,使其长度为16个字符并获得更独特的结果。例如://if(number.Length=15)//number="Y"+number;//if(number.Length=14)//number="7"+number+"z";//等-嘿,我已经说过这是一个hack;)//我们将当前数字作为密码传递给每个数字0-9的AES加密。这会返回一组值,我们可以然后根据数字的当前状态对数字进行排序并获得//随机顺序。字典前缀CipherResults=newDictionary();for(intndx=0;ndxgroup=newList();foreach(stringkeyinprefixCipherResults.Keys.OrderBy(k=>k))group.Add(prefixCipherResults[key]);returngroup;}你说的有点像一次性垫与明文长度相同的键,然后对每个单独的字符进行数学运算。AxorB=CCxorB=A或换句话说AxorBxorB=A只要您不在多个不同的输入上使用相同的密钥B(例如B对于每次加密都必须是唯一的),那么您可以在不知道AB是什么的情况下理论上恢复原来的A。如果您多次使用同一个B,则所有投注均无效。后续评论:你不应该结束比你开始更多的数字。xor只是翻转位,它没有任何进位功能。以6位数字结尾很奇怪……至于代码:$plaintext=array(digit1,digit2,digit3,digit4,digit5,digit6);$key=array(key1,key2,key3,key4,key5,key6);$ciphertext=array()#加密foreach($plaintextas$idx=>$char){$ciphertext[$idx]=$charxor$key[$idx];}#解密foreach($ciphertextas$idx=>$char){$decrypted[$idx]=$charxor$key[$idx];为简单起见,这只是一个数组。对于实际数据,您可以按字节或按字处理,并按顺序对每个块进行异或运算。您可以使用比输入短的密钥字符串,但这使得对密钥进行逆向工程变得更容易。理论上,您可以使用单个字节来执行异或运算,但随后您基本上实现了与rot-13等效的位级。另一种进行简单加密的方法是,您可以从10对每个数字进行子结构化。例如,初始数字:12345610-1=910-2=810-3=7等。您将得到987654您可以将其与XOR结合使用以获得更安全的加密。例如,您可以添加数字为const的数字(214354178963...等等),并应用“~”运算符(反转所有位)这不安全,但可以肯定您可以解密您的数字。任何人只要有反射器或者ildasm就可以破解这个加密算法。我不知道您的业务需求是什么,但您必须这样做。如果要求中有足够的回旋余地来接受16位十六进制数字作为加密端,只需将12位十进制数字解释为64位明文并使用64位分组密码,例如Blowfish、Triple-DES或IDEA。以上就是C#学习教程:将一个数字加密成另一个长度相同的数字分享全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: