Javascript 使用CryptoJS加密并从Objective-C解密

Javascript 使用CryptoJS加密并从Objective-C解密,javascript,objective-c,encryption,cryptography,cryptojs,Javascript,Objective C,Encryption,Cryptography,Cryptojs,在两个应用程序之间的通信中,我想用JavaScript加密一段信息,并使用固定密钥解密Objective-C客户机发出的消息(只是为了基本安全) 加密效果良好: var命令=“mjallo”; var crypto_key=CryptoJS.enc.Base64.parse('280f8bb8c43d532f389ef0e2a5321220'); var crypto_iv=CryptoJS.enc.Base64.parse(“CC0A69779E15780A”); //加密和编码 var en

在两个应用程序之间的通信中,我想用JavaScript加密一段信息,并使用固定密钥解密Objective-C客户机发出的消息(只是为了基本安全)

加密效果良好:

var命令=“mjallo”;
var crypto_key=CryptoJS.enc.Base64.parse('280f8bb8c43d532f389ef0e2a5321220');
var crypto_iv=CryptoJS.enc.Base64.parse(“CC0A69779E15780A”);
//加密和编码
var encrypted=CryptoJS.AES.encrypt(命令,crypto_密钥,{iv:crypto_iv}).toString();
var encrypted_和_encoded=btoa(加密);
//加密的_和_编码=>'dFBQVDZZS3dGSktoa0J3Y1NQOElpZz09'
//确认解密与CryptoJS一起工作:
//破译
var decrypted=CryptoJS.AES.decrypt(atob(加密的_和_编码的),crypto_密钥,{iv:crypto_iv});
//解密=>'mjallo'
使用CryptoJS加密后,您将如何对Objective-c中的消息进行解码和解密?

我尝试使用解密,但没有成功。以下是RubyMotion语法:

  begin
    res = CocoaSecurity.aesDecryptWithBase64('dFBQVDZZS3dGSktoa0J3Y1NQOElpZz09', hexKey: '280f8bb8c43d532f389ef0e2a5321220', hexIv: 'CC0A69779E15780A')
  rescue NSException => e
    p e.reason # => "Length of iv is wrong. Length of iv should be 16(128bits)"
  end

AES支持128位的块大小和128、192和256位的密钥大小。CBC模式的IV(默认值)应为128位

您的编码密钥由32个字符组成。在CryptoJS中,您将其解析为Base64,这将产生一个192位的密钥,但在CocoaSecurity中,您假定它是十六进制编码的。因为它只包含数字和字母a到f,所以它可能是十六进制编码的,而不是Base64编码的。如果假设它是十六进制编码的,那么将获得128位的有效AES密钥大小:

var crypto_key=CryptoJS.enc.Hex.parse('280f8bb8c43d532f389ef0e2a5321220');
另一方面,在相同的假设下,你的IV没有有效的大小。对于CBC模式下的AES,IV应为16字节长。此外,IV不应固定在静态值。您需要为每个加密生成一个随机IV。因为IV不一定是秘密的,你可以把它和密文一起发送

var crypto_iv=CryptoJS.lib.WordArray.random(128/8);
console.log(“IV:+crypto_IV.toString());//十六进制编码
CryptoJS..encrypt()
的结果是一个特殊的可格式化对象。如果在该对象上调用
toString()
,将得到一个Base64编码的密文(在使用基于密码的加密时,可以选择使用salt)。但是,通过调用
btoa()
再次使用Base64对其进行编码。你不需要对它进行两次编码

var encrypted=CryptoJS.AES.encrypt(命令,crypto_密钥,{iv:crypto_iv}).toString();
log(“密文(Base64):”+encrypted.toString());
log(“密文(十六进制):”+加密的.Ciphertext.toString());
据我判断,你的RubyMoon密码看起来不错


如果您只能更改CocoaSecurity代码,则需要

  • 通过将密钥解码为Base64并将其编码为十六进制来重新编码密钥
  • 在IV十六进制字符串中追加16个“0”字符,因为CryptoJS会将IV填充到下一个有效IV中,并使用0x00字节
  • 从Base64对密文解码一次


您应该始终对密文进行身份验证。这可以通过GCM等认证模式或密文上的HMAC来完成。

非常感谢@Arthon B.提供了非常周到的回答。我摆脱了双重编码,换成了十六进制键,通过了IV,一切都很顺利。非常感谢。你能分享目标C代码,用它来加密和解密吗CryptoJS@Chandni不,我不能。您应该询问Jonas,或者更好,使用RNCryptor,它有不同语言的实现。@ArtjomB。谢谢您的回复。@JonasNielsen-您能分享使用CryptoJS进行加密和解密的目标C代码吗。谢谢