iOS Swift vs Node JS加密不同的输出

问题描述:

我不知道我的节点JS代码有什么问题。节点JS的输出缺少一些字符,而不是iOS Swift中的输出。iOS Swift vs Node JS加密不同的输出

我的节点JS代码:

var crypto    = require('crypto'); 

var CRYPTO_ALGORITHM = "aes-256-ctr"; 
var CRYPTO_PASSWORD  = "3zTvzr3p67VC61jmV54rIYu1545x4TlY"; 
var CRYPTO_IV   = ""; 

var string_data = "OLIVER MARTINEZ OLIVER"; 

var cipher  = crypto.createCipheriv(CRYPTO_ALGORITHM, CRYPTO_PASSWORD, CRYPTO_IV); 
var encrypted = cipher.update(string_data, "utf8", "hex"); 
encrypted  += cipher.final("hex"); // to hex 

console.log("encrypted final: " + encrypted); 

// --------------------------------------------------------------- // 

var encrypted_string = encrypted; 

var decipher = crypto.createDecipheriv(CRYPTO_ALGORITHM, CRYPTO_PASSWORD, CRYPTO_IV); 
var decrypted = decipher.update(encrypted_string, "hex", "utf8"); 
decrypted  += decipher.final("utf8"); // to utf8 

console.log("decrypted final: " + decrypted); 

节点输出:3df3cfd9adef86489fd27629d75f3fcbb744e5bae846

我的iOS Swift代码:

let CRYPTO_IV   = ""; 
let CRYPTO_PASSWORD  = "3zTvzr3p67VC61jmV54rIYu1545x4TlY"; 

let data    = "OLIVER MARTINEZ OLIVER"; 

let encrypted = try! data.encrypt(AES(key: CRYPTO_PASSWORD, iv: CRYPTO_IV, blockMode: .CTR)).toHexString(); 

print("encrypted: \(encrypted)"); 

IOS SWIFT OUTPUT:3df3cfd9adef86489fd27629d75f3fcbb744e5bae846bde7df9e98571ba27f01

正如你所看到的。输出非常相似。只有NodeJS输出缺少一些字符。

CTR mode是一种流模式,不需要任何填充。看起来CryptoSwift总是添加填充,即使使用像CTR这样的流式传输模式。您需要请求没有填充将在斯威夫特应用:

data.encrypt(AES(key: CRYPTO_PASSWORD, iv: CRYPTO_IV, blockMode: .CTR, padding: NoPadding())).toHexString();
+1

请注意,'NoPadding()'**不能**被称为目前'CryptoSwift'模块外(由于缺乏'公共初始化的NoPadding')。 我已经打开了一个[pull request](https://github.com/krzyzanowskim/CryptoSwift/pull/254),它被合并到'develop'分支中,并且将在不久的将来发布(希望)。 –

+0

非常感谢Artjom ..我在使用NoPadidng()时也遇到了错误..我很高兴这不仅仅是我,它很快就会解决。非常感谢先生。真的很有帮助 – nemoryoliver