草庐IT

javascript - RNCryptor IOS + Javascript 加密/解密 AES 256

coder 2024-01-13 原文

我是加密新手,我正在尝试使用 AES256 通过 websockets 从移动应用程序到网页进行一些对称加密。

我使用 RNCryptor 默认设置加密数据

iOS 代码

   NSString* message = @"testmessage";
   NSData* pubData = [message dataUsingEncoding:NSUTF8StringEncoding];
   NSData *encryptedData = [RNEncryptor encryptData:pubData
                                        withSettings:kRNCryptorAES256Settings
                                            password:@"test"
                                               error:&error];
    if(error) {
        NSLog(@"Error encrypting %@", [error localizedDescription]);
    }

    NSString* encryptedString = [encryptedData base64Encoding];
    NSLog(@"Sending message %@", encryptedString);
    [self.session publishData:[encryptedString dataUsingEncoding:NSUTF8StringEncoding] onTopic:@"test12345"];

这是通过 websockets 输出的 AgEBnXPPvAkJb7YVapwCVNd5SQw4JwqU7BfLsEXNZyKy9SazfJT8w16Y/hYY7aKxuz3Kuy2tAXXX/cHCc3PMhvG+fzSfrslRVMKvD6L+oWvXLg==

JavaSCRIPT 代码 - 我收到消息并尝试解析它并显示它

function onMessageArrived(message) {

  var rawData = base64.decode(message.payloadString);
  var encryptionSalt = rawData.substr(2,8);
  var hmacSalt = rawData.substr(10,8);
  var iv = rawData.substr(18, 16);
  var ciphertext = rawData.substr(34, rawData.length-34-32);
  var hmac = rawData.substr(rawData.length-32, 32);
  var password = "test";

  var key = CryptoJS.PBKDF2(password, encryptionSalt, { keySize: 256 / 32, iterations: 10000});

  var plaintextArray = CryptoJS.AES.decrypt(
    { ciphertext: CryptoJS.enc.Utf8.parse(ciphertext) },
    CryptoJS.enc.Hex.parse(key),
    { iv: CryptoJS.enc.Latin1.parse(iv) }
  );

   showScreen('<span style="color: blue;">User: ' + CryptoJS.enc.Latin1.stringify(plaintextArray) + '</span>');
};

出于某种原因,代码在生成 key 时卡住了(对于 CryptoJS 来说,可能 10k 次迭代太多了???这就是 IOS 上使用的迭代)

我已经尝试了很多不同的东西,但输出是垃圾,我实际上并没有解密消息。任何帮助将不胜感激。如果您打算推荐 SJCL,请提供一些代码。 RNCryptor 使用自己的消息格式。我使用它是因为它提供了随机化的 iv。如果您也知道,请推荐其他图书馆。

感谢阅读。

最佳答案

请遵循 RNCryptor 文件格式的文档:https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md

您应该能够从文件中获取所有必要的数据并添加您的共享 key ...

RNCryptor 数据格式版本 3 规范

Byte:     |    0    |    1    |      2-9       |  10-17   | 18-33 | <-      ...     -> | n-32 - n |
Contents: | version | options | encryptionSalt | HMACSalt |  IV   | ... ciphertext ... |   HMAC   |
  • 版本(1 字节):数据格式版本。目前 3.
  • 选项(1 字节): 位 0 - 使用密码
  • encryptionSalt(8 字节):iff 选项包括 “使用密码”
  • hmacsalt(8个字节):iff选项包括“用途 密码”
  • IV(16 字节)密文(可变)——用 CBC 加密 模式 HMAC(32 字节)

所有数据均按网络顺序(大端)。

关于javascript - RNCryptor IOS + Javascript 加密/解密 AES 256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871069/

有关javascript - RNCryptor IOS + Javascript 加密/解密 AES 256的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - Ruby 中的单 block AES 解密 - 2

    我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

    我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

随机推荐