【问题标题】:iOS mobile app and Node.js web app AES 256 encryptioniOS 移动应用和 Node.js Web 应用 AES 256 加密
【发布时间】:2014-01-19 22:07:28
【问题描述】:

我想创建一个 iOS 移动应用程序来与我的 Node.js Web 应用程序进行通信。为了加密从移动设备发送到 Web 应用程序的数据,我决定使用 AES 256 加密,然后转换为 base64。问题是我发现的所有 Objective-C 库都没有与 Node.js 相同的输出(对于相同的密码和输入文本)。我不知道该怎么办...

以下是一些 iOS 库:

另外,对于 Node.js 平台,我尝试了这些库:

  • 所有these four
  • 基于this example我已经构建了我的:

    var crypto = require('crypto'); 
    var key = "onceuponatime";
    var toCrypt = "Hello World!"; 
    var output = ''; 
    var decrypted = '';
    
    var cipher = crypto.createCipher('aes256', key); 
    output += cipher.update(toCrypt, 'utf-8', 'base64');
    
    output += cipher.final('base64');
    
    console.log(output);
    
    var deCipher = crypto.createDecipher('aes256', key); 
    decrypted += deCipher.update(output,'base64','utf-8');
    
    decrypted += deCipher.final('utf-8');
    
    console.log(decrypted);
    

使用FBEncryptor 和我的Node.js 示例,我得到以下加密的base64 字符串作为我提供的输入:7TsBLBvS6A1iByn9OTkzWA==mZ9cf4oklVN2ZnD0oQ0Tjw==。你能帮我找到一个解决方案,让我在 iOS 和 Node.js 上都获得相同的加密字符串吗?谢谢。

【问题讨论】:

  • 显示您的 iOS 代码以及您的测试输入和输出。如果使用 FBEncryptor,您使用的是哪种方法。有几件事需要知道:算法,密钥大小,密钥,模式,iv 如果不是 ECB 模式,ii 填充完成,如果是,它是如何完成的。这些需要知道,而打包方法的问题是这些信息可能不可用。
  • @Theo。 AES256 有不同的版本。结帐nodejs.org/api/crypto.html#crypto_crypto_getciphers 以查看节点支持的内容。另一方面,了解 FBEncryptor 使用哪一个可能会有所帮助
  • @bodokaiser “不同版本的 AES256”是什么意思?只有一个版本。也许您的意思是不同的 Node.js 函数?
  • @Zaph 你查看我给你的链接了吗?有“AES-128-CBC”、“AES-128-CBC-HMAC-SHA1”等等。所以我建议它与 AES256 算法相同。
  • @bodokaiser "AES-128-CBC-HMAC-SHA1" 不是 AES 的不同版本,它描述了一个 Node.js 函数。 “128”指定密钥长度,“CBC”指定 CBC 模式并且需要 iv。 “HMAC-SHA1”是 Node.js 函数执行的附加操作。 AES 对 8 位数据进行加密和解密。脚本语言的问题之一是它们隐藏了真正发生的事情,从而难以实现互操作性。基本上,如果开发人员不了解加密,则开发人员不应该使用加密,安全性中的单个错误(错误)就是彻底失败。

标签: javascript ios iphone node.js encryption


【解决方案1】:

如果您查看FBEncryptor 的源代码,您会发现它为密钥创建了一个 32 字节的零填充缓冲区,并为 IV 创建了一个 16 字节的零填充缓冲区。然后将密钥复制到密钥缓冲区中。 IV 缓冲区保持不变。为了通过 Node.js 产生相同的输出,我们需要复制 FBEncryptor 内部发生的事情。

您需要使用 crypto.createCipheriv 并提供 IV,而不是使用 crypto.createCiphercrypto.createDecipher 也是如此。

让我们来看看 node.js 代码:

var crypto = require('crypto'); 
var key     = "onceuponatime";
var toCrypt = "Hello World!";

这与您的原始脚本没有变化。我们只需导入crypto 模块并设置加密密钥和要加密的字符串。

// Create the 32-byte zero-filled key buffer
keyBuf = new Buffer(Array(32));
// Copy the key into this buffer
keyBuf.write(key, 'utf8');

// Create the 16-byte zero-filled IV buffer
ivBuf = new Buffer(Array(16));

在这里,我们创建用于加密toCrypt 的密钥和 IV 缓冲区。

var cipher = crypto.createCipheriv('aes256', keyBuf, ivBuf); 
output = cipher.update(toCrypt, 'utf-8', 'base64') + cipher.final('base64');
console.log(output);

接下来,我们使用密钥和 IV 缓冲区设置密码并加密toCrypt。这将产生7TsBLBvS6A1iByn9OTkzWA==,它与FBEncryptor 相同。

var deCipher = crypto.createDecipheriv('aes256', keyBuf, ivBuf); 
decrypted = deCipher.update(output,'base64','utf-8') + deCipher.final('utf-8');
console.log(decrypted);

在这里,我们使用密钥和 IV 缓冲区设置解密器并解密加密的字符串。这将产生输出Hello World!

【讨论】:

  • 非常感谢,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多