簡體   English   中英

iOS:使用公鑰(具有模數和指數)進行RSA加密

[英]iOS: RSA Encrypt using public key (with modulus and exponent)

我正在嘗試使用公共密鑰對RSA進行NSData加密。 公鑰采用以下格式:

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

從XML字符串中提取模數和指數后,如何從下面的方法publicKey它們用作publicKey來獲取SecKeyRef

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

我似乎在任何地方都找不到明確的答案。

哇,難怪很難找到答案。 我在加密兔子洞里呆了2天,這並不漂亮。

簡單的方法

使用Chilkat iOS RSA庫 一個主要缺點:花費189美元! :O

艱難的道路

解析XML,使用SCZ-BasicEncodingRules-iOS從模數和指數中生成公鑰數據。 如果可行,請使用該公鑰創建一個虛擬鑰匙串(請參見此處的示例代碼 ),現在以SecKeyRef格式提取公鑰並將其傳遞給問題中的encryptRSA方法。 最后,清理,移除虛擬鑰匙串。 從理論上講聽起來不錯,但我從未對此進行全面測試,如果您願意,請告訴我!

我已經使用下面的方法使用公鑰加密而不使用任何第三方庫,猜測它們可能會像我一樣幫助那些在實施相同方法后尋找相同內容的人: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];
}

我認為這對您有幫助! 您可以創建一個類似家伙的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());

得到它了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM