0

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

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

从 XML 字符串中提取模数和指数后,我如何从下面的方法中获取SecKeyRef要使用的模数和指数publicKey

+ (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];
}

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

4

3 回答 3

1

哇,难怪很难找到这个问题的答案。我在加密兔子洞里呆了 2 天,但它并不漂亮。

简单的方法

使用Chilkat iOS RSA 库。一个主要缺点:售价 189 美元!:O

艰难的路

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

于 2013-10-24T06:09:19.623 回答
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];
}
于 2019-05-27T14:10:34.290 回答
-3

我想这会帮助你!你可以像朋友一样创建一个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());

知道了!

于 2014-12-04T10:51:33.810 回答