第一次海报在这里。这里的社区很棒。经过无休止的搜索,我无法找到我面临的这个问题的答案。
首先,在加密/解密,密码学等方面,我不是专家。我只想在这个领域走得那么远而不会迷路。我编写的主要框架是.NET,我被要求为C#创建一个AES CBC实现,该实现可以在JavaScript和ActionScript 3上运行。我在两者上都取得了成功,但在JavaScript方面却遇到了麻烦。
我决定使用SlowAES AES实现,因为它似乎在使用最佳互操作时最受欢迎。
请查看有关我的问题的以下链接...
问题#9:http://code.google.com/p/slowaes/issues/detail?id=9
基本上,我使用SlowAES的问题是,我无法在不知道原始未加密文本长度的情况下正确解密某些内容。这打败了目的吧?我应该能够解密加密的字符串,而无需知道原始字符串。
如果我错过了什么,请指出正确的方向,我将不胜感激。值得庆幸的是,我没事,因为我汇总的.NET AES实现可以解密SlowAES加密的内容,与ActionScript 3的实现相同。
此时,我只想让SlowAES正确解密。
更新
在获得Remus的帮助之后,我确定SlowAES使用的是PKCS5 / 7填充方案,但未正确删除它。现在我的问题似乎出在C#,理解字节数组等方面。
我可以看到解密文本中的最后一个字符是“ 5”,其后是“ 0”。此模式持续5次。现在从下面的Remus说起,我应该用这个数字减去解密后的字符串长度。但是模式是“ 05”,这是否意味着我将5乘以10,然后再从解密的字符串长度中减去10,这是我的两倍吗?
另外,获得我要减去的数字的最简单方法是什么?我正在使用以下方法来获取当前号码:Byte[] decryptedBytes = System.Text.Encoding.ASCII.GetBytes(decrypted);
Byte padLengthByte = decryptedBytes[decryptedBytes.Length - 1];
Char padLengthChar = Convert.ToChar(padLengthByte);
String padLengthString = padLengthChar.ToString();
Int32 padLength = Int32.Parse(padLengthString);
我确定我做错了。同样,任何帮助总是很感激。
我还有另一个问题,您如何知道是否首先将填充应用于填充?如果“ \ 07”表示填充的7个字节,那么最后一个字节是“ \ 01 \”怎么办?
最佳答案
这是因为SlowAES显然没有实现常用的填充方案,例如PKCS:Issue 4: Implement PKCS7 padding。即使该库没有实现它,对您来说,实现它也确实是微不足道的:一旦您获得了解密(填充)的文本,只需分析最后一块并从填充信息中减去原始长度即可。如果我没有记错的话,PKCS7填充在RFC2315中进行了描述。
更新
如果用PKCS7填充文本,则解密文本中的最后一个字节将包含填充的长度。因此,您进行解密,然后从解密文本的末尾删除与最后一个字节的值一样多的字符。例如。
原始文本是“这是原始文本”。它的长度为25。
加密会将长度填充到32(下一个16大小的块),因此它将加密块“这是原始文本\ 07 \ 07 \ 07 \ 07 \ 07 \ 07 \ 07 \ 07”。
填充的块被加密为32个长度的加密文本
您解密32长度的地穴,并从2中取回填充的文本)
解密块的最后一个字节是'\ 07',因此您从解密块中减去7个字节。结果是长度为25的原始文本:“这是原始文本”
PS:我会添加JavaScript代码,但是我的JavaScript编码技巧相当生锈。
关于encryption - 没有原始大小,SlowAES无法正确解密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2300146/