当前位置: 首页 > 面试题库 >

加密iOS并解密Node.js AES

沈子实
2023-03-14
问题内容

我一直在寻找一个解决方案,并在Node.js服务器和Objective-C客户端上进行加密,反之亦然,使用AES(或其他合适的方法)进行搜索

我对密码学还比较陌生,因此我无法理解为什么每种语言的加密文本都不同。

这是我到目前为止的内容:

使用此CryptoJS库的
Node.js加密方法 -node-cryptojs-aes

var node_cryptojs = require("node-cryptojs-aes");
var CryptoJS = node_cryptojs.CryptoJS;

    var textToEncrypt = 'Hello';
var key_clear = 'a16byteslongkey!';

//encrypted + decrypted

var encrypted = CryptoJS.AES.encrypt(clearText, key_clear, { iv: null });
var decrypted = CryptoJS.AES.decrypt(encrypted, key_clear, { iv: null });

//Outputs   
    console.log("encrypted: " + encrypted);     //encrypted: U2FsdGVkX1/ILXOjqIw2Vvz6DzRh1LMHgEQhDm3OunY=
console.log("decrypted: " + decrypted.toString(CryptoJS.enc.Utf8));   // decrypted: Hello

使用AESCrypt库的 Objective-C加密方法

NSString* textToEncrypt = @"Hello";

// encrypt
NSString* encryptedText = [AESCrypt encrypt:textToEncrypt password:@"a16byteslongkey!"];

// decrypt
NSString* decryptedText = [AESCrypt decrypt:encryptedText password:@"a16byteslongkey!"];

// output
NSLog(@"Text to encrypt: %@", textToEncrypt);    // Text to encrypt: Hello
NSLog(@"Encrypted text: %@", encryptedText);     // Encrypted text: wY80MJyxRRJdE+eKw6kaIA==
NSLog(@"Decrypted text: %@", decryptedText);     // Decrypted text: Hello

多年来,我一直在挠头,尝试了我能想到的一切。如果需要,可以显示库中的基础加密方法。AESCrypt库中的密钥上已应用SHAR256哈希,但是我已删除了它,并认为字符串编码有些不匹配。


问题答案:
  1. 您确定两个库中都使用了相同的密钥吗?您说您取出了AESCrypt中的SHA-256部分,库现在如何使用password参数?AES算法只能使用长度为16、24或32个字节的密钥。您的密码长16个字节,但是您是否在加密功能中将相应的参数更改为128(而不是256)?您知道CryptoJS如何使用key参数吗?您确定将其直接使用,还是在传递给基础原始AES加密功能之前进行一些处理(例如,哈希处理)?

  2. CryptoJS库使用哪种加密方式?它的文档没有说。鉴于它要求进行静脉输液,可能是CBC,但您必须查看数据源才能确定。AESCrypt的文档声称使用CBC模式,但是您在任何地方都没有提供它IV。那必须意味着它在某个地方生成自己的东西,或者总是使用固定的东西。(其中一半失败了CBC模式的目的,但这是另一回事了)。因此,您需要弄清楚IV到底是什么。

TL; DR:除非确保在两个库中使用相同的密钥和密钥长度,相同的模式和相同的IV,否则您将拥有不同的密文。



 类似资料:
  • 我需要在iPhone或iPad上加密字符串(实际上是XML文件),然后用.NET应用程序解密。感谢David Veksler在这里提出的问题“.NET和iPhone之间的AES互操作性?”,以及在这里发表的博客文章http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iPhone/。

  • 问题内容: 我有一个从Java服务器发送的公钥。在我解码并去除ASN.1标头之前,base64编码的字符串匹配。我使用将公钥存储在钥匙串中。 因此,我尝试使用公共密钥对数据进行加密,并使用Java中的私有密钥对其进行解密。我在iOS端和Java端使用。 我正在加密的是对称AES密钥,该密钥对我的实际数据进行加密,因此密钥长度为16个字节。当简单地对密钥进行base64编码时,一切正常,因此我知道此

  • 我正在尝试解密AES加密数据(在. NET中加密),但我的解密结果字符串似乎不可读,并且我没有收到任何错误。 数据加密使用: < li>Padding: PKCS7Padding < li>KeySize: 128 < li >模式:CBC, 我有InItVector、PassCode、salt和NumberOfPassword(3)次迭代。 这是我的代码: 下面是在 .NET 端加密数据的代码:

  • 我正在iOS上使用加密/解密我的机密密钥,并将其保存在中。已成功设置并加密数据。但是每当我试图解密数据时,它都会给我以下错误: Error domain=nsosstatuserrordomain code=-50\“ecies:未能到aes-gcm解密数据\”userinfo={nsdescription=ecies:未能到aes-gcm解密数据} 此外,在10.3中,使用KseckeyAlgo

  • 问题内容: 我有以下Go代码 输出是 使用以下CryptoJS加密 并且可以用解密 输出是-这是正确的输出 为什么Go会有不同的输出? 问题答案: 请检查您的错误。总是 https://play.golang.org/p/dRLIT51u4I 更具体地说,字节75处的值为,超出了base64可用字符的范围。在ascii中,它是ENQ(查询)字符。至于为什么它最终出现在您的最终base64字符串中,