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();
请注意,'NoPadding()'**不能**被称为目前'CryptoSwift'模块外(由于缺乏'公共初始化的NoPadding')。 我已经打开了一个[pull request](https://github.com/krzyzanowskim/CryptoSwift/pull/254),它被合并到'develop'分支中,并且将在不久的将来发布(希望)。 –
非常感谢Artjom ..我在使用NoPadidng()时也遇到了错误..我很高兴这不仅仅是我,它很快就会解决。非常感谢先生。真的很有帮助 – nemoryoliver