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 ライブラリを使用します。1 つの大きな欠点: コストは 189 ドルです! :O

難しい方法

XML を解析し、S​​CZ-BasicEncodingRules-iOSを使用して、法と指数から公開鍵データを生成します。それが機能する場合は、その公開鍵を使用してダミーのキーチェーンを作成し (こちらのサンプル コードに従ってください)、形式で公開鍵を抽出し、問題のメソッドにSecKeyRef渡します。encryptRSA最後に、クリーンアップして、ダミー キーチェーンを取り外します。理論的には良さそうですが、これを徹底的にテストしたことはありません。

于 2013-10-24T06:09:19.623 に答える
-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 に答える