Generate RSA public key from module and metric in bytes in Objective-c

I searched many websites trying to figure out how RSA works.

I have a module "A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BBB12F97DED70AE5E4480FC9C5E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E92C1C529276D8AF8EC7F28492097D8CD5BECEA16FE4088F6CFAB4A1B42328A1B996F9278B0B7E3311CA5EF856C2F888474B83612A82E4E00D0CD4069A6783140433D50725F" and exponent "03", and I have to decipher the information formatted in hexadecimal bytes. My questions:

How to create a public key? As soon as I have the public key, should I encode in base64, or is the public key ready for decryption?

+3
source share
1 answer

After several days of research, I finally did it with OpenSSL. I'm not an expert in C ++, so I'm not sure that all characters, constant characters and unsigned characters are declared correctly, so if anyone has a better idea, edit it =). You should have lybcrypto.a and libssl.a (here you can find them https://github.com/x2on/OpenSSL-for-iPhone ). I tested EMV VISA keys several times and it works.

#include <openssl/opensslv.h> #include <openssl/rsa.h> #include <openssl/evp.h> #include <openssl/bn.h> @implementation ViewController -(NSData*) decryptIPKC:(NSString*)ipkc modulus:(NSString*)mod exponent:(NSString*)exp{ NSString * hexString = ipkc; int hexStringLength= [hexString length] / 2; //unsigned char enc_bin[144]; unsigned char dec_bin[hexStringLength]; //int enc_len; int dec_len; RSA * rsa_pub = RSA_new(); const char *N=[mod UTF8String] ; const char *E=[exp UTF8String]; char * myBuffer = (char *)malloc((int)[hexString length] / 2 + 1); bzero(myBuffer, [hexString length] / 2 + 1); for (int i = 0; i < [hexString length] - 1; i += 2) { unsigned int anInt; NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)]; NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr]; [scanner scanHexInt:&anInt]; myBuffer[i / 2] = (char)anInt; } printf("Mybuffer: %s",myBuffer); if (!BN_hex2bn(&rsa_pub->n, N)) { printf("NO CARGO EL MODULO"); } printf(" N: %s\n", N); printf(" n: %s\n", BN_bn2hex(rsa_pub->n)); if (!BN_hex2bn(&rsa_pub->e, E)) { printf("NO CARGO EL EXPONENTE"); } printf(" E: %s\n", E); printf(" e: %s\n", BN_bn2hex(rsa_pub->e)); printf("public key size : %d bits\n", RSA_size(rsa_pub)); /* decrypt */ if ((dec_len = RSA_public_decrypt(hexStringLength, (unsigned char*)myBuffer, dec_bin, rsa_pub,RSA_NO_PADDING))<0) { printf("NO\n "); } printf("decrypted data:\n %s", dec_bin); print_hex(dec_bin, dec_len); NSData* data = [NSData dataWithBytes:dec_bin length:sizeof(dec_bin)]; free(myBuffer); return data; } - (void)viewDidLoad { [super viewDidLoad]; NSString *m= @"Your HEX modulus here"; NSString * e=@ "Your HEX exponent"; NSString * hexString= @"Your HEX message here"; NSData *decryptedIPKC= [self decryptIPKC:hexString modulus:m exponent:e]; NSLog(@"ESTE ES EL NSDATA %@", decryptedIPKC.description); } @end 
+3
source

Source: https://habr.com/ru/post/973251/


All Articles