iOS移动应用和Node.js网络应用AES 256加密

 Ag冫g彡ie琪琪 发布于 2023-02-07 08:53

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

以下是一些iOS库:

FBEncryptor

AESCrypt

也是在这里是一个相当不错的例子

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

所有这四个库

基于这个例子,我构建了我的:

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上得到相同的加密字符串吗?谢谢.

1 个回答
  • 如果查看源代码FBEncryptor,您将看到它为密钥创建了一个32字节的零填充缓冲区,为IV创建了一个16字节的零填充缓冲区.然后将密钥复制到密钥缓冲区中.IV缓冲区未受影响.为了通过Node.js生成相同的输出,我们需要复制内部发生的事情FBEncryptor.

    而不是使用crypto.createCipher,你需要使用crypto.createCipheriv和提供IV.同样如此crypto.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));
    

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

    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!.

    2023-02-07 08:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有