I want to encrypt the communication between my server (written in nodeJS) and the iOS app (written in objective-C) using asymmetric encryption (RSA).
What I am looking to do is to only encrypt the data that I send from the iOS app (using the public key) to the server, where the server needs to decrypt the data (using the private key) in order to read it.
Using the following library from GitHub, for testing purposes, I was able to successfully encrypt and then decrypt the string "hello world!" using objective-C. Note: NSString* encWithPubKey is the encrypted base64 string
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!
Using the following link, for testing purposes as well, I was also able to encrypt and then decrypt the string "hello world!" using 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');
Both of the following examples printed "hello world!" successfully. Next, I took the encrypted string, NSString*encWithPubKey, from what I got in objective-C (which is in base64 format) and then I tried to decrypt it with 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');
However, when doing so, I receive the following error in nodeJS:
From my understanding, this error means that the encrypted string was invalid. However, I am unable to understand why I am getting this error. I am able to encrypt and decrypt the same string if I do it with the same language, however, I am unable to communicate between the two languages.
Please note that BOTH the iOS app and the nodeJS are using the following public and private keys respectively:
-----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-----
I've tried to look online, but I wasn't able to find enough resources to solve the problem. Any help will be appreciated! Thank you!
Thanks to Curious Programmer I found the answer from this link:
I now require node-rsa instead of just rsa. And I the line that fixed my code is this:
myDecrypter.setOptions({encryptionScheme: 'pkcs1'});
where myDecrypter is the private key.