微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RC2 加密结果在 Python 和 Java 中的差异

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?