【问题标题】:Generating public key from modulus and exponent [duplicate]从模数和指数生成公钥[重复]
【发布时间】:2017-03-29 04:50:45
【问题描述】:

我有模数

MjAxNzY5NTQ0ODc1ODUxMzcyOTQ3ODM5MjI1NzQ2MzQ1MTUzNjQxMjMxODE4NTE1NzQwODUwODI0NjYxMTA4NTA0MTc2ODU4MDUzMzE2ODIwMzI2NDcyMDI2NTkyMjc0MjgwMjE1NDg3MDEwNzU2NzA3OTU4NzQ2MTYxNzI5NDc5OTUzMzAwOTM0OTA4MTc4NDI2MTM5NDc3MDMxNzkxMzg0MDAyOTE5NjMyMTAyMDA5MjEwNDQ4MzU1MzYwOTY0ODkxODAxNjY5MTM4MTQ4NjU0Njg3OTA0NjUxNTUxOTIzMDU4MjQ0Njg2MTQ5NzkzMTQwNzYzODM2MjY1MjA2NjcyMjY4MjQzMDE2MjA4MTQ3NjAwMzIwNzI2MTIzNzQ4MjA5MzIwODIwODc2ODMxNzgzNzA4NTYyMzg5MzI2OTc2NTM2NjgyNzY0MDgwMTM3ODY1MjIyNjc5OTQ3NDMwMzIwMDE0NTAzMDE2ODQyMTQyNjgxNjMwNTA4OTQ1MDU3OTgzMDEzNDMwNDYxMDY5OTA3NjI0MzU3Mjc5MjU0MTQ5NDUzMzMyODUxNjkyOTc3OTIxMTUzNjIzOTg1Nzk0NzkyMzY2NDY2NDQwNTczMTQxMjc2ODAwOTU1MTU4NTQxOTk4ODM1MDIyMjk2NTE1ODU3ODI5Mjk2NzMzNjM1MjE3Mjk4ODYxNDYwODg3NjY4NDU4MjAzMzc3NjM5ODc2MTMyMTQ1MjczODAzOTAzMzU0ODA5MTYzNjEwNDE3ODgwNTAyNzA1NTM2NzMwNzQ1OTc1MzgwMjM2NjI5MjY3NjkzOTU2NTcyMDE = P>

和指数

65537

请帮助我使用 Objective-C 的模数和指数生成公钥。

【问题讨论】:

    标签: ios objective-c iphone public-key-encryption


    【解决方案1】:

    正如 zaph 在this answer 中所写,以下代码应该可以满足您的需求:

    NSData* bytesFromHexString(NSString * aString) {
        NSString *theString = [[aString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:nil];
    
        NSMutableData* data = [NSMutableData data];
        int idx;
        for (idx = 0; idx+2 <= theString.length; idx+=2) {
            NSRange range = NSMakeRange(idx, 2);
            NSString* hexStr = [theString substringWithRange:range];
            NSScanner* scanner = [NSScanner scannerWithString:hexStr];
            unsigned int intValue;
            if ([scanner scanHexInt:&intValue])
                [data appendBytes:&intValue length:1];
        }
        return data;
    }
    
    NSString *modulusString =  @"...";
    NSString *exponentString = @"65537";
    
    NSData *pubKeyModData = bytesFromHexString(modulusString);
    NSData *pubKeyExpData = bytesFromHexString(exponentString);
    NSArray *keyArray = @[pubKeyModData, pubKeyExpData];
    
    //Given that you are using SCZ-BasicEncodingRules-iOS:
    NSData *berData = [keyArray berData];
    NSLog(@"berData:\n%@", berData);
    
    NSString *berBase64 = [berData base64EncodedStringWithOptions:0];
    NSString *preamble = @"-----BEGIN CERTIFICATE REQUEST-----";
    NSString *postamble = @"-----END CERTIFICATE REQUEST-----";
    NSString *pem = [NSString stringWithFormat:@"%@\n%@\n%@", preamble, berBase64, postamble];
    NSLog(@"pem:\n%@", pem);
    

    【讨论】:

    • 我试过了,但是生成的公钥无法加密数据。
    • 它实际上是在生成一个pem文件的内容。你能说明你是如何加密数据的吗?
    • iOS 不提供生成公钥的机制,因为我们从 java 或 android 获取它是非常具体的。通过添加 API 并将 mod 和 exp 发送到服务器并取回公钥来解决问题。感谢您的帮助
    【解决方案2】:

    为此,请确保您已链接 OpenSSL 库(此处为说明http://code.google.com/p/ios-static-libraries/

    链接后,您将可以访问多个 BIGNUM 转换器。我使用 BN_hex2bn 方法将模数转换为十六进制,将十六进制字符串保存为“指数”

    然后创建 BIGNUM 结构并使用 RSA_public_encrypt 进行加密

    RSA *rsa = NULL;
    rsa->n = BN_new();
    BN_copy(rsa->n,modulus);   
    rsa->e = BN_new();
    BN_copy(rsa->e,exponent);     
    rsa->iqmp=NULL;
    rsa->d=NULL;
    rsa->p=NULL;
    rsa->q=NULL;
    

    【讨论】:

      猜你喜欢
      • 2015-06-22
      • 1970-01-01
      • 2017-05-27
      • 2021-05-01
      • 2016-06-26
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多