我在c#中使用AES / CFB / NoPadding算法加密数据,但是在Java中无法以相同的模式解密..我得到了不同的结果。

CFB-NoPadding模式允许任何字节数据输入和相同长度数据输出。

我可以在使用CBC填充模式下执行此操作..但是在CFB无填充模式下无法使用。

谁能帮我 ?

C#加密代码:

_assistantRM.Mode = CipherMode.CFB;
_assistantRM.Padding = PaddingMode.None;
_assistantRM.FeedbackSize = 8;
_assistantRM.IV = new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
_assistantRM.Key = _assitantKey;


Java解密代码:

SecretKeySpec sk = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, sk, new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF });
byte[] result = cipher.doFinal(bytes);
return result;

最佳答案

Java中的算法字符串中有一个鲜为人知的开关。尝试使用"AES/CFB8/NoPadding"(注意B后面的8个字符)。它配置用作加密块反馈的位数。

请注意,通常不会再使用CFB的错误恢复了。使用完整的128位反馈效率要高得多。或者,您可以完全使用其他模式,例如CTR或GCM模式加密。

10-06 10:20