iOS:使用公钥进行RSA加密(带模数和指数)

时间:2013-10-18 21:31:33

标签: iphone ios xml encryption rsa

我正在尝试使用公钥对NSData进行RSA加密。公钥采用以下格式:

<RSAKeyValue>
  <Modulus>yOTe0L1/NcbXdZYwliS82MiTE8VD5WD23S4RDsdbJOFzCLbsyb4d+K1M5fC+xDfCkji1zQjPiiiToZ7JSj/2ww==</Modulus>
  <Exponent>AWAB</Exponent>
</RSAKeyValue>

从XML字符串中提取模数和指数后,如何在下面的方法中使用SecKeyRef作为publicKey?{/ p>

+ (NSString *)encryptRSA:(NSString *)plainTextString key:(SecKeyRef)publicKey
{
    size_t cipherBufferSize = SecKeyGetBlockSize(publicKey); 
    uint8_t *cipherBuffer = malloc(cipherBufferSize); 
    uint8_t *nonce = (uint8_t *)[plainTextString UTF8String]; 
    SecKeyEncrypt(publicKey,
        kSecPaddingOAEP, 
        nonce, 
        strlen( (char*)nonce ), 
        &cipherBuffer[0], 
        &cipherBufferSize);
    NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize]; 
    return [encryptedData base64EncodedString];
}

我似乎无法在任何地方找到明确的答案。

3 个答案:

答案 0 :(得分:1)

哇,难怪找到答案很难。我在加密兔子洞里度过了2天,而且它不漂亮。

简单方法

使用Chilkat iOS RSA Library。一个主要缺点:花费189美元! :O

艰难的方式

解析XML,使用SCZ-BasicEncodingRules-iOS从模数和指数中生成公钥数据。如果可行,请使用该公钥创建虚拟钥匙串(按照sample code here),现在以SecKeyRef格式提取公钥,并将其传递给问题中的encryptRSA方法。最后,清理,删除虚拟钥匙串。理论上听起来不错,但我从来没有彻底测试过,如果你这样做,请告诉我!

答案 1 :(得分:0)

我使用下面的方法使用公钥加密而不使用任何第三方库,猜测它们可能会像我一样帮助谁在实现相同目的之后寻找相同的东西:D

+(NSString *)encryptRSA:(NSString *)plainTextString key:(SecKeyRef)publicKey
{
    size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
    uint8_t *cipherBuffer = malloc(cipherBufferSize);
    uint8_t *nonce = (uint8_t *)[plainTextString UTF8String];
    SecKeyEncrypt(publicKey,
                  kSecPaddingPKCS1,
                  nonce,
                  strlen( (char*)nonce ),
                  &cipherBuffer[0],
                  &cipherBufferSize);
    NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];
    return [encryptedData base64EncodedStringWithOptions:0];
}

答案 2 :(得分:-2)

我认为这会对你有所帮助! 你可以像同伴一样创建一个java文件: 这个java函数会生成一个base64String的公钥

public static RSAPublicKey getPublicKey(String modulus, String exponent) {
    try {
        BigInteger b1 = new BigInteger(modulus,16);
        BigInteger b2 = new BigInteger(exponent,16);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
        return (RSAPublicKey) keyFactory.generatePublic(keySpec);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public static  String  encodePublicKey(byte[] encoded) throws Exception{
    BASE64Encoder base64Encoder= new BASE64Encoder();
    String s=base64Encoder.encode(encoded);
    return s;

你应该使用:encodePublicKey(publicKey.getEncoded());

知道了!