iOS上的RSA加密(RSA / ECB / PKCS1Padding)

时间:2014-06-25 13:47:20

标签: ios objective-c encryption rsa

我需要使用iOS上的网络服务器证书中的公钥加密NSString。这就是我在Android上做的事情(工作正常):

public byte[] Encrypt(String plain) throws NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException,
            IllegalBlockSizeException, BadPaddingException {

        publicKey = "MyPublicKeyStringExtractedFromACertificate"

        cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(plain.getBytes());

        return encryptedBytes;
}

这就是我在iOS上尝试的内容:

NSString *publicKey = @"MyPublicKeyStringExtractedFromACertificate"; // Base64 encoded key from my webserver certificate
NSData *keyData = [[NSData alloc] initWithBase64EncodedString:publicKey options:NSDataBase64DecodingIgnoreUnknownCharacters];
SecCertificateRef certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef) keyData); // this is returning nil

publickey来自webservice证书(在我的应用程序包上)。

我做错了什么?我怎么能使用SecKeyEncrypt?

2 个答案:

答案 0 :(得分:1)

MIHCrypto拥有我需要的一切。 https://github.com/hohl/MIHCrypto

答案 1 :(得分:0)

使用字符串作为公钥,您无法使用Java Cipher进行加密。您需要一个PublicKey对象。例如:

X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(der_bytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(publicSpec);

der_bytes需要是DER形式,而不是PEM形式,这里。