objective-c - 从 Objective-c 中的模数和指数以字节为单位生成 RSA 公钥

标签 objective-c openssl rsa modulus exponent

我搜索了许多网站,试图了解 RSA 的工作原理。

I have a modulus "A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BBB12F97DED70AE5E4480FC9C5E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E92C1C529276D8AF8EC7F28492097D8CD5BECEA16FE4088F6CFAB4A1B42328A1B996F9278B0B7E3311CA5EF856C2F888474B83612A82E4E00D0CD4069A6783140433D50725F"and exponent "03"and i have to decrypt information formated in hex bytes.我的问题是:

如何创建公钥? 获得公钥后,我是否必须使用 base64 进行编码,或者公钥已准备好解密?

最佳答案

经过几天的研究,我终于用 OpenSSL 做到了。我不是 C++ 专家,所以我不确定是否正确声明了所有字符、常量字符和无符号字符,所以如果有人有更好的主意,请编辑它 =)。您必须拥有 lybcrypto.a 和 libssl.a(您可以在此处找到它们 https://github.com/x2on/OpenSSL-for-iPhone )。我用 EMV VISA key 测试了几次,它有效。

#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

关于objective-c - 从 Objective-c 中的模数和指数以字节为单位生成 RSA 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420259/

相关文章:

ssl - 服务器如何加密? (特别是 openSSL)

iphone - 在界面构建器的 UILabel 中使用本地化文本?

c - openSSL 示例中的 SSL 接受错误

java - 如何使用 Java Keytool 将 PKCS12 openssl keystore 转换为 JKS keystore

ruby-on-rails - ruby OpenSSL RSA 字符编码

swift - 使用 RSA 从 Swift 到 C# 进行加密

ios - 如果搜索字符串包含左 "("和右 ")"括号,则 NSPredicate 不起作用

ios - CFBundle 运行时错误 - 这是什么意思?

iphone - NSDictionary,这是为什么

ssl - 400 错误请求 : The SSL certificate error