将 Blowfish 加密从 Java 转换为 Python

Posted

技术标签:

【中文标题】将 Blowfish 加密从 Java 转换为 Python【英文标题】:Convert Blowfish Encryption from Java to Python 【发布时间】:2022-01-12 04:56:08 【问题描述】:

我正在尝试将我的 Java Blowfish 加密算法转换为 Python。我正在使用 blowfish 包,它采用与 Java 库相同的参数。它们都成功执行,但是,我没有得到相同的结果。

Java 代码

    public static void main(String[] args) 

    try 
        String mainText = "hello world";
        String stBlowfishIv = "zzyyxxaa";
        String stBlowfishKey = "how.good";

        byte[] byteString;
        IvParameterSpec iv = new IvParameterSpec(stBlowfishIv.getBytes());
        SecretKey key = new SecretKeySpec(stBlowfishKey.getBytes(), "Blowfish");
        Cipher c = Cipher.getInstance("Blowfish/CFB/NoPadding");
        c.init(Cipher.ENCRYPT_MODE, key, iv);
        byteString = c.doFinal(mainText.getBytes());
        System.out.println(Arrays.toString(byteString));
    
    catch (GeneralSecurityException e) 
        throw new RuntimeException(e);
    

输出

[47, -19, 48, -42, 19, 126, -105, 66, 21, -126, -44]

Python 代码

    def encrypt(self, initVector="zzyyxxaa", key="how.good"):

    totalString = "hello world"
    initVectorBytes = bytes(initVector, 'utf-8')
    keyBytes = bytes(key, 'utf-8')
    totalStringBytes = bytes(totalString, 'utf-8')

    cipher = blowfish.Cipher(keyBytes)

    dataEncrypted = b"".join(cipher.encrypt_cfb(totalStringBytes, initVectorBytes))
    print(dataEncrypted)

    for byte in dataEncrypted:
        print(byte, end=' ')

输出

b'/\xed0\xd6\x13~\x97B\x15\x82\xd4'

47 237 48 214 19 126 151 66 21 130 212

我们将不胜感激一些帮助或指导。

【问题讨论】:

是相同的输出。请注意,在每个输出数组中字符不同的位置处,两个不同的值总和为 256。这能告诉您什么吗? (提示:有符号字节与无符号字节) 【参考方案1】:

Java 输出

[47, -19, 48, -42, 19, 126, -105, 66, 21, -126, -44]

Python 输出

47 237 48 214 19 126 151 66 21 130 212

这些代表完全相同的位模式,因此您的代码可以正常工作。

明显的区别在于,在 Java 中byte 类型是有符号的。请注意,唯一的区别是在 Java 输出中显示为负值的输出字节。

以第一个区别为例,-19237,这两者的位模式都是 0xED,或二进制 1110 1101。如果解释为无符号,则值为237,但如果解释为有符号,则值为-19

【讨论】:

谢谢吉姆,这非常有帮助!

以上是关于将 Blowfish 加密从 Java 转换为 Python的主要内容,如果未能解决你的问题,请参考以下文章

java-信息安全-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4

iOS blowfish加密解密

从使用 Blowfish 和 ECB 的 mcrypt 迁移到 OpenSSL

几种加密算法的测试,包括对称加密和非对称加密

对称加密和非对称加密

逆向常见加密算法值BlowFish算法