如何解决RC2 加密结果在 Python 和 Java 中的差异
为了旧版兼容性,我的任务是获取 40 个字符的值并在末尾添加 00000000 并在 CBC 模式下使用 RC2 进行加密。我得到了一个用于加密的 20 个字符的密钥和一个用 Java 编写的独立工具,已经用于一次加密一个 48 个字符的字符串。我正在编写一个脚本,该脚本将遍历 48 个字符值的列表,对每个值进行加密,然后将其写回表中。我试图按照 Java 代码来复制该过程,但没有得到相同的结果。任何帮助,将不胜感激。目前,用于测试的值列表中只有一个 48 个字符的值。稍后它会指向一个Oracle表进行输入和输出:
值:e134db7b54ac00cb4236bb1be093e555613a54a600000000
密钥:4757A2501EF662FD4C62
Python 结果:EE2FCB7440EF47E55D4C01E8FCFF0069FB31438C4D69CA54
Java 结果:F05CD7CD8906548C9B9FA2489D0B80A090BCF1D24FCE425B
蟒蛇:
from Cryptodome.Cipher import ARC2
values = ['e134db7b54ac00cb4236bb1be093e555613a54a600000000']
for value in values:
value = bytearray(value,'ascii').decode('hex')
key = bytearray('4757A2501EF662FD4C62','ascii').decode('hex')
iv = '\x00\x00\x00\x00\x00\x00\x00\x00'
ef_keylen = 80
cipher = ARC2.new(key,ARC2.MODE_CBC,iv=iv,effective_keylen=ef_keylen)
encryptedvalue = cipher.encrypt(value)
encryptedvalue = encryptedvalue.encode('hex')
Java:
public static byte[] encrypt(String value,String rc2Key) throws Exception {
byte[] valueBytes = Hex.decodeHex(value.tochararray());
byte[] rc2KeyBytes = Hex.decodeHex(rc2Key.tochararray());
Key k = new SecretKeySpec(rc2KeyBytes,"RC2");
byte[] iv = {0,0};
RC2ParameterSpec spec = new RC2ParameterSpec(rc2Key.length() * 4,iv);
Cipher cipher = Cipher.getInstance("RC2/CBC/nopadding");
cipher.init(Cipher.ENCRYPT_MODE,k,spec);
byte[] encrypted = cipher.doFinal(valueBytes);
return encrypted;
}
为什么我得到不同的加密值?我错过了什么步骤。我精通 Python 或 C#,但我是 Java 新手,所以不确定我哪里出错了...
解决方法
代码很好。我发现给我的值用于测试是错误的。在此处解码十六进制值之前,我必须发送密钥的长度: cipher = ARC2.new(key,ARC2.MODE_CBC,iv=iv,Effective_keylen=ef_keylen)
我将密码更正为: 密码 = ARC2.new(b_rc2key,iv,Effective_keylen=len(rc2key)*4)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。