0

对于遗留兼容性,我的任务是获取 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 新手,所以不确定我哪里出错了......

4

1 回答 1

0

代码很好。我发现给我的值对于测试是错误的。在此处解码十六进制值之前,我必须发送密钥的长度: cipher = ARC2.new(key, ARC2.MODE_CBC, iv=iv, effective_keylen=ef_keylen)

我将密码更正为: cipher = ARC2.new(b_rc2key, ARC2.MODE_CBC, iv, effective_keylen=len(rc2key)*4)

于 2021-06-04T14:02:10.493 回答