将 Blowfish 加密从 Java 转换为 Python

Convert Blowfish Encryption from Java to Python

我正在尝试将我的 Java Blowfish 加密算法转换为 Python。我正在使用河豚包,它采用与 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

非常感谢一些帮助或指导。

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 类型是 signed。请注意,唯一的区别是在 Java 输出中显示为负值的输出字节。

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