对于遗留兼容性,我的任务是获取 40 个字符的值并在末尾添加 00000000 并在 CBC 模式下使用 RC2 进行加密。我得到了一个用于加密的 20 个字符的密钥和一个用 Java 编写的独立工具,已经用于一次加密一个 48 个字符的字符串。我正在编写一个脚本,它将遍历 48 个字符值的列表,加密每个值,然后将其写回表中。我尝试按照 Java 代码复制该过程,但没有得到相同的结果。任何帮助,将不胜感激。目前,用于测试的值列表中只有一个 48 个字符的值。稍后它将指向一个 Oracle 表进行输入和输出:
值:e134db7b54ac00cb4236bb1be093e555613a54a600000000
键:4757A2501EF662FD4C62
Python 结果:EE2FCB7440EF47E55D4C01E8FCFF0069FB31438C4D69CA54
Java 结果:F05CD7CD8906548C9B9FA2489D0B80A090BCF1D24FCE425B
Python:
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')
爪哇:
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,0,0,0,0,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 新手,所以不确定我哪里出错了......