用C和Java实现河豚解密
我在Java/Scala中用MCRYPT重写了一个C程序,但是我得到了不同的Java和C解码字符串 我做错了什么用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,
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。