使用nodeJS和Objective-C的非对称公钥/私钥加密RSA

galhe2

我想使用非对称加密(RSA)对服务器(用nodeJS编写)和iOS应用(用Objective-C编写)之间的通信进行加密。

我要做的是仅加密从iOS应用程序(使用公钥)发送到服务器的数据,服务器需要在服务器上解密数据(使用私钥)才能读取数据。

使用来自GitHub的以下库,出于测试目的,我能够成功加密然后解密字符串“ hello world!”。使用Objective-C。注意: NSString * encWithPubKey是加密的base64字符串

  • https://github.com/ideawu/Objective-C-RSA

    NSString *pubkey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI2bvVLVYrb4B0raZgFP60VXY\ncvRmk9q56QiTmEm9HXlSPq1zyhyPQHGti5FokYJMzNcKm0bwL1q6ioJuD4EFI56D\na+70XdRz1CjQPQE3yXrXXVvOsmq9LsdxTFWsVBTehdCmrapKZVVx6PKl7myh0cfX\nQmyveT/eqyZK1gYjvQIDAQAB\n-----END PUBLIC KEY-----";
    NSString *privkey = @"-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMMjZu9UtVitvgHS\ntpmAU/rRVdhy9GaT2rnpCJOYSb0deVI+rXPKHI9Aca2LkWiRgkzM1wqbRvAvWrqK\ngm4PgQUjnoNr7vRd1HPUKNA9ATfJetddW86yar0ux3FMVaxUFN6F0KatqkplVXHo\n8qXubKHRx9dCbK95P96rJkrWBiO9AgMBAAECgYBO1UKEdYg9pxMX0XSLVtiWf3Na\n2jX6Ksk2Sfp5BhDkIcAdhcy09nXLOZGzNqsrv30QYcCOPGTQK5FPwx0mMYVBRAdo\nOLYp7NzxW/File//169O3ZFpkZ7MF0I2oQcNGTpMCUpaY6xMmxqN22INgi8SHp3w\nVU+2bRMLDXEc/MOmAQJBAP+Sv6JdkrY+7WGuQN5O5PjsB15lOGcr4vcfz4vAQ/uy\nEGYZh6IO2Eu0lW6sw2x6uRg0c6hMiFEJcO89qlH/B10CQQDDdtGrzXWVG457vA27\nkpduDpM6BQWTX6wYV9zRlcYYMFHwAQkE0BTvIYde2il6DKGyzokgI6zQyhgtRJ1x\nL6fhAkB9NvvW4/uWeLw7CHHVuVersZBmqjb5LWJU62v3L2rfbT1lmIqAVr+YT9CK\n2fAhPPtkpYYo5d4/vd1sCY1iAQ4tAkEAm2yPrJzjMn2G/ry57rzRzKGqUChOFrGs\nlm7HF6CQtAs4HC+2jC0peDyg97th37rLmPLB9txnPl50ewpkZuwOAQJBAM/eJnFw\nF5QAcL4CYDbfBKocx82VX/pFXng50T7FODiWbbL4UnxICE0UBFInNNiWJxNEb6jL\n5xd0pcy9O2DOeso=\n-----END PRIVATE KEY-----";
    
    NSString *originString = @"hello world!";
    
    // Demo: encrypt with public key
    NSString *encWithPubKey = [RSA encryptString:originString publicKey:pubkey];
    NSLog(@"Enctypted with public key: %@", encWithPubKey);// prints the encrypted string in base64 format
    
    
    // Demo: decrypt with private key
    NSString *decWithPrivKey = [RSA decryptString:encWithPubKey privateKey:privkey];
    NSLog(@"Decrypted with private key: %@", decWithPrivKey);// prints -> hello world!
    

使用以下链接(出于测试目的),我还能够加密然后解密字符串“ hello world!”。使用nodeJs:

  • https://coolaj86.com/articles/asymmetric-public--private-key-encryption-in-node-js

    var fs = require('fs');
    var ursa = require('/PATH/ursa');
    
    var pubkeyAlice = ursa.createPublicKey(fs.readFileSync("/PATH/public.pem"));
    var privkeyAlice = ursa.createPrivateKey(fs.readFileSync("/PATH/private.pem"));
    
    var msg = "hello world!";
    var enc = pubkeyAlice.encrypt(msg, 'utf8', 'base64');
    console.log('encrypted string:'+enc);
    
    var rcv = privkeyAlice.decrypt(enc, 'base64', 'utf8');
    console.log('decrypted', rcv, '\n');
    

以下两个示例均显示“ hello world!” 成功地。接下来,我从objective-C(采用base64格式)中获取了加密的字符串NSString * encWithPubKey,然后尝试使用nodeJS对其进行解密:

    var privkeyAlice = ursa.createPrivateKey(fs.readFileSync("/PATH/private.pem"));

    var enc = <  HERE IS THE ENCRYPTED STRING RECEIVED FROM Objective-C : encWithPubKey  >
    var rcv = privkeyAlice.decrypt(enc, 'base64', 'utf8');
    console.log('decrypted', rcv, '\n');

但是,这样做时,我在nodeJS中收到以下错误:

  • 错误:错误:040A1079:RSA例程:RSA_padding_check_PKCS1_OAEP_mgf1:oaep解码错误

据我了解,此错误意味着加密的字符串无效。但是,我无法理解为什么会出现此错误。如果使用相同的语言,我可以加密和解密相同的字符串,但是,我无法在两种语言之间进行通信。

请注意,iOS应用程序和nodeJS都分别使用以下公共密钥和私有密钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI2bvVLVYrb4B0raZgFP60VXY
cvRmk9q56QiTmEm9HXlSPq1zyhyPQHGti5FokYJMzNcKm0bwL1q6ioJuD4EFI56D
a+70XdRz1CjQPQE3yXrXXVvOsmq9LsdxTFWsVBTehdCmrapKZVVx6PKl7myh0cfX
QmyveT/eqyZK1gYjvQIDAQAB
-----END PUBLIC KEY-----


-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMMjZu9UtVitvgHS
tpmAU/rRVdhy9GaT2rnpCJOYSb0deVI+rXPKHI9Aca2LkWiRgkzM1wqbRvAvWrqK
gm4PgQUjnoNr7vRd1HPUKNA9ATfJetddW86yar0ux3FMVaxUFN6F0KatqkplVXHo
8qXubKHRx9dCbK95P96rJkrWBiO9AgMBAAECgYBO1UKEdYg9pxMX0XSLVtiWf3Na
2jX6Ksk2Sfp5BhDkIcAdhcy09nXLOZGzNqsrv30QYcCOPGTQK5FPwx0mMYVBRAdo
OLYp7NzxW/File//169O3ZFpkZ7MF0I2oQcNGTpMCUpaY6xMmxqN22INgi8SHp3w
VU+2bRMLDXEc/MOmAQJBAP+Sv6JdkrY+7WGuQN5O5PjsB15lOGcr4vcfz4vAQ/uy
EGYZh6IO2Eu0lW6sw2x6uRg0c6hMiFEJcO89qlH/B10CQQDDdtGrzXWVG457vA27
kpduDpM6BQWTX6wYV9zRlcYYMFHwAQkE0BTvIYde2il6DKGyzokgI6zQyhgtRJ1x
L6fhAkB9NvvW4/uWeLw7CHHVuVersZBmqjb5LWJU62v3L2rfbT1lmIqAVr+YT9CK
2fAhPPtkpYYo5d4/vd1sCY1iAQ4tAkEAm2yPrJzjMn2G/ry57rzRzKGqUChOFrGs
lm7HF6CQtAs4HC+2jC0peDyg97th37rLmPLB9txnPl50ewpkZuwOAQJBAM/eJnFw
F5QAcL4CYDbfBKocx82VX/pFXng50T7FODiWbbL4UnxICE0UBFInNNiWJxNEb6jL
5xd0pcy9O2DOeso=
-----END PRIVATE KEY-----

我尝试过在线查找,但是找不到足够的资源来解决问题。任何帮助将不胜感激!谢谢!

galhe2

感谢好奇的程序员,我从此链接中找到了答案:

我现在需要node-rsa,而不仅仅是rsa。我固定我的代码的行是这样的:

    myDecrypter.setOptions({encryptionScheme: 'pkcs1'});

其中myDecrypter是私钥。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

AES 256加密:公钥和私钥如何生成和使用.net

来自分类Dev

在C#中使用RSA公钥和私钥加密数据

来自分类Dev

Python pyCrypto RSA加密方法使用私钥或公钥提供相同的结果

来自分类Dev

使用现有公钥的RSA加密

来自分类Dev

RSA私钥和公钥

来自分类Dev

使用公钥/私钥的iOS App数据加密

来自分类Dev

如何在C#RSA中使用私钥加密和使用公钥解密

来自分类Dev

使用DER格式的RSA公钥文件的iOS加密

来自分类Dev

C#BouncyCastle-使用公钥/私钥进行RSA加密

来自分类Dev

Jasypt和非对称加密

来自分类Dev

使用OpenSSL生成RSA公钥/私钥?

来自分类Dev

如何在Ruby中使用PKI(公钥/私钥)加密?

来自分类Dev

C#RSA使用给定的PKCS#1公钥加密文本

来自分类Dev

HTTPS使用非对称或对称加密?

来自分类Dev

Expo可以使用哪些RSA公钥加密选项?

来自分类Dev

OpenSSL:使用ECC公钥加密对称密钥

来自分类Dev

JWT使用非对称加密

来自分类Dev

反序列化RSA公钥和私钥C#

来自分类Dev

如何使用ssh-rsa公钥加密文本?

来自分类Dev

如何在没有对称密码的情况下对短数据使用公钥/私钥

来自分类Dev

使用pkcs填充模式的RSA公钥加密

来自分类Dev

SSH何时使用非对称和对称加密?

来自分类Dev

对称和公钥加密

来自分类Dev

使用给定的RSA公钥OpenSSL加密字符串

来自分类Dev

如何在Ruby中使用PKI(公钥/私钥)加密?

来自分类Dev

使用nodeJS和Objective-C的非对称公钥/私钥加密RSA

来自分类Dev

使用来自 X509 证书 C++ 的公钥的 RSA 公共加密

来自分类Dev

使用公钥和私钥发送加密和签名的电子邮件以在 FMCSA 中提交数据

来自分类Dev

RSA 和非对称加密上下文中的证书是什么?

Related 相关文章

热门标签

归档