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
source share