没有原始大小,SlowAES无法正确解密

时间:2010-02-19 22:44:49

标签: encryption javascript rijndael aes

这里的第一次海报。这里有很棒的社区。经过无数个小时的搜索,我无法找到我面临的这个问题的答案。

首先,在加密/解密,密码学等方面,我不是大师。我只想在这个领域走得这么远而不会迷路。我编写的主要框架是.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#,理解Byte Arrays等等。

我可以看到我的解密文本中的最后一个字符是'5',前面是'0'。这种模式持续5次。现在从Remus下面说的,我应该用这个数字减去解密的字符串长度。但模式是'05',这是否意味着我加倍5然后从我的解密字符串长度减去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 \'?

怎么办?

2 个答案:

答案 0 :(得分:5)

这是因为很明显,SlowAES没有实现常用的填充方案,比如PKCS:Issue 4: Implement PKCS7 padding。即使库没有实现它,实现它也是非常简单的:一旦获得解密(填充)文本,只需分析最后一个块并从填充信息中减去原始长度。如果我没弄错的话,RFC2315中描述了PKCS7填充。

<强>更新

如果使用PKCS7填充文本,则解密文本中的最后一个字节将包含填充的长度。因此,您解密然后从解密文本末尾删除与最后一个字节上的值一样多的字符。例如。

  1. 原文是'这是原文'。它的长度为25。
  2. 加密将填充长度为32(16个大小的下一个块),因此它将加密块'这是原始文本\ 07 \ 07 \ 07 \ 07 \ 07 \ 07 \ 07'。
  3. 填充块加密为32长度密码文本
  4. 你解密32长度的密码并从2)
  5. 取回填充的文本
  6. 解密块的最后一个字节是'\ 07',因此您从解密的块中减去7个字节。结果是原始文本,长度为25:'这是原始文本'
  7. PS:我会添加JavaScript代码,但我的JavaScript编码技巧相当生疏。

答案 1 :(得分:0)

您可以做的一件事是将数据填充到一个完整的128位块大小。这样你就不用担心PKCS#7填充了,因为你自己就是这么做的。几乎没有最佳,但至少你已经开始运行了:))