【问题标题】:Generate RSA Public key from modulus and exponent in bytes in Objective-c在 Objective-c 中从模数和指数以字节为单位生成 RSA 公钥
【发布时间】:2013-03-14 21:09:14
【问题描述】:

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

我有一个模量“A89F25A56FA6DA258C8CA8B40427D927B4A1EB4D7EA326BBB12F97DED70AE5E4480FC9C5E8A972177110A1CC318D06D2F8F5C4844AC5FA79A4DC470BB11ED635699C17081B90F1B984F12E92C1C529276D8AF8EC7F28492097D8CD5BECEA16FE4088F6CFAB4A1B42328A1B996F9278B0B7E3311CA5EF856C2F888474B83612A82E4E00D0CD4069A6783140433D50725F”和指数“03”,我必须在十六进制字节格式化解密信息。我的问题是:

如何创建公钥? 一旦我有了公钥,我是否必须在 base64 中进行编码或公钥已准备好解密?

【问题讨论】:

    标签: objective-c openssl rsa modulus exponent


    【解决方案1】:

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

    #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
    

    【讨论】:

    • 嗨,我在这一行遇到了崩溃 - printf("decrypted data:\n %s", dec_bin); & print_hex(dec_bin, dec_len); - 这一行给了我执行错误。我需要为 print_hex 包含任何其他库吗?请帮帮我。如果可能,请将您的代码分享给我的电子邮件 ID - meshram.nitesh@gmail.com
    • 您好,现在这段代码非常适合我。我还需要你的帮助。我在这一行得到了正确的输出 printf("Mybuffer: %s",myBuffer);但是当我尝试将“decryptedIPKC”转换为字符串时,我没有得到 null 。这是我的代码 NSString* newStr = [NSString stringWithUTF8String:[decryptedIPKC bytes]];。谢谢
    • 这应该做的工作 (NSString*) bytesToHexString:(NSData*)nsData{ if(nsData == nil){ return nil; } //Byte* bData = (Byte*)[nsData bytes]; NSMutableString* hexString =[NSMutableString 字符串]; const unsigned char *p = [nsData 字节]; for(int i=0;i
    猜你喜欢
    • 2015-06-22
    • 2015-05-16
    • 2016-06-26
    • 2011-04-19
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2023-03-21
    相关资源
    最近更新 更多