繁体   English   中英

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

[英]Encrypt with CryptoJS and decrypt from Objective-C

在两个应用程序之间的通信中,我想使用JavaScript加密一条信息,并使用固定密钥(仅出于基本安全性)解密来自Objective-C客户端的消息。

加密效果很好:

var command = "mjallo";
var crypto_key = CryptoJS.enc.Base64.parse('280f8bb8c43d532f389ef0e2a5321220');
var crypto_iv  = CryptoJS.enc.Base64.parse("CC0A69779E15780A");
// Encrypt and encode
var encrypted = CryptoJS.AES.encrypt(command, crypto_key, {iv: crypto_iv}).toString();
var encrypted_and_encoded = btoa(encrypted);
// encrypted_and_encoded => 'dFBQVDZZS3dGSktoa0J3Y1NQOElpZz09'

// Confirms that decrypt works with CryptoJS:
// Decode and decrypt
var decrypted = CryptoJS.AES.decrypt(atob(encrypted_and_encoded), crypto_key, {iv: crypto_iv});
// decrypted => 'mjallo'

在使用CryptoJS加密后,您将如何在Objective-c中解码和解密消息?

我尝试使用CocoaSecurity解密,但是没有运气。 以下是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中,您假定它是十六进制编码的。 由于它仅包含数字和字母af ,因此很可能是十六进制编码的,而不是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()); // hex encoded

CryptoJS.<Cipher>.encrypt()是一个特殊的formattable对象。 如果在该对象上调用toString() ,则将获得Base64编码的密文(使用基于密码的加密时,可选地带有盐)。 但是,然后您通过调用btoa()再次使用Base64对其进行编码。 您无需对其进行两次编码。

var encrypted = CryptoJS.AES.encrypt(command, crypto_key, {iv: crypto_iv}).toString();
console.log("Ciphertext (Base64): " + encrypted.toString());
console.log("Ciphertext (Hex): " + encrypted.ciphertext.toString());

据我判断,您的RubyMotion代码看起来不错。


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM