用C和Java实现河豚解密

用C和Java实现河豚解密,java,c,scala,blowfish,Java,C,Scala,Blowfish,我在Java/Scala中用MCRYPT重写了一个C程序,但是我得到了不同的Java和C解码字符串 我做错了什么 char * decode(char *string) { MCRYPT mcrypt_blowfish; mcrypt_blowfish = mcrypt_module_open("blowfish-compat", NULL, "ecb", NULL); unsigned char hardKey[] = { 0xEF, 0x3A, 0xB2, 0x9C,

我在Java/Scala中用MCRYPT重写了一个C程序,但是我得到了不同的Java和C解码字符串

我做错了什么

char * decode(char *string) {
    MCRYPT mcrypt_blowfish;
    mcrypt_blowfish = mcrypt_module_open("blowfish-compat", NULL, "ecb", NULL);
    unsigned char hardKey[] = { 0xEF, 0x3A, 0xB2, 0x9C, 0xD1, 0x9F, 0x0C, 0xAC, 0x57, 0x59, 0xC7, 0xAB, 0xD1, 0x2C, 0xC9, 0x2B, 0xA3, 0xFE, 0x0A, 0xFE, 0xBF, 0x96, 0x0D, 0x63, 0xFE, 0xBD, 0x0F, 0x45};
    mcrypt_generic_init(mcrypt_blowfish, hardKey, 28, NULL);
    mdecrypt_generic(mcrypt_blowfish, string, 512);
    mcrypt_generic_deinit(mcrypt_blowfish);
    mcrypt_module_close(mcrypt_blowfish);
    string[512] = 0;

    return string;
}
Scala代码

def decode (string: String ): String = {

    val keyBytes: Array[Char] = Array[Char](0xEF, 0x3A, 0xB2, 0x9C, 0xD1, 0x9F, 0x0C, 0xAC, 0x57, 0x59, 0xC7, 0xAB, 0xD1, 0x2C, 0xC9, 0x2B,0xA3, 0xFE, 0x0A, 0xFE, 0xBF, 0x96, 0x0D, 0x63,0xFE, 0xBD, 0x0F, 0x45)

    val cipher: Cipher = Cipher.getInstance("Blowfish/ECB/NoPadding")
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(new String (keyBytes).getBytes, "Blowfish"))

    new String(cipher.doFinal(string.getBytes.reverse))
}

不确定它是否有用,但可以尝试将
keyBytes
声明为
Array[Byte]
(因为Java/Scala中的
Char
是一个2字节的unicode字符),并将其直接传递到
新的SecretKeySpec(…)
。对于大于0x7F的值,您可能需要将其强制转换为字节:
0x80.toByte
,因为所有数字都在JVM上签名。将密钥从
byte[]
转换为
String
,反之亦然:河豚不再被认为是安全的,它被AES取代。河豚不应用于新的工作和更新时,可能在旧的工作。即使是《河豚和双鱼》的作者也使用AES。