My requirements are:
Requirement 1: Share public key to java server.
Steps:
- Generate public-private keys in iOS app.
- Store the generated keys in keychain.
- Send generated public key to java server.
- Java server shall be able to store shared public key in database.
Requirement 2: Store public key sent by java server.
Steps:
- Java server sends public key of other user.
- Process data sent by java server and generate public key from it.
- Store generated key in keychain, which can be later retrieved for encrypting message to be transferred.
I am able to achieve steps 1-2 in requirement 1 by using below method defined in SecKeyWrapper class (CommonCrypto sample):
- (void)generateKeyPair:(NSUInteger)keySize
Question 1: Now problem is- how shall I send that key to java server?
We have getPublicKeyBits
method in the same class, which returns an NSData object, on some googling I found that it is in DER encoded format.
Question 2: If I send the same NSData object to server, which I guess it will interpret as ByteBuffer object, will it be possible for other devices, in my case it could be android, to interpret that data?
Question 3: What is the best way to share public key in above scenarios?
This is what I am trying to achieve from some days now:
Approach #1: Trying to generate public key from exponent and modulus
Android End
- Generated public and private key at an android device (using an openssl wrapper)
- Got modulus and exponent from the generated public key
iOS End
- Generated public key from modulus and exponent, at ios end, using code specified in this link: https://stackoverflow.com/a/10643962/217586
- Converted some sample string to an object of NSData using NSUTF8StringEncoding
- Used - wrapSymmetricKey:keyRef: method defined in SecKeyWrapper class (CryptoExercise example) for encryption, and passed key obtained from step 1 and data to encrypt obtained from step 2 to it
- Converted NSData (encrypted data) obtained in previous step to base64encoded string, shared the same to android guy
Android End
- Tried to decrypt the base64encoded string, using related private key
Problem:
getting error - too much data for RSA block
Approach #2: (Got to know from this link that - https://github.com/superwills/iOSRSAPublicKeyEncryption, we are not supposed to load public keys in iOS from anything other than a certificate, so tried a different approach)
Terminal End
- Generated certificate using openssl commands specified in this url: https://stackoverflow.com/a/17295321/217586
iOS End
- Obtained public key as specified in above url
Used below code to encrypt the data:
SecKeyWrapper *secKeyWrapper = [SecKeyWrapper sharedWrapper]; SecKeyRef obtainedPublicKey = [secKeyWrapper getPublicKeyRefFromDerCertificate:kCertificatePath]; NSData *dataToBeEncrypted = [kStringToBeEncrypted dataUsingEncoding:NSUTF8StringEncoding]; NSData *encryptedText = [secKeyWrapper wrapSymmetricKey:dataToBeEncrypted keyRef:obtainedPublicKey];
Converted NSData to base64encoded string
Terminal End
Used below command to convert it back to original string:
echo | openssl rsautl -decrypt -inkey rsaPrivate.pem
Problem:
getting error - rsa routines:RSA_EAY_PRIVATE_DECRYPT:data greater than mod len:/SourceCache/OpenSSL098/OpenSSL098-47.1/src/crypto/rsa/rsa_eay.c
Any suggestions?