3

我有一个基于客户端/服务器的应用程序。该客户端是为 iOS 和 OSX 开发的。服务器对于客户端都是通用的(并且服务器的实现不能更改)。

在 iOS 中开发的客户端生成一个 RSA 公钥/私钥对,并将 base64 编码的公钥发送到服务器。服务器(用 Java 实现)加密一些安全数据并将其发送给需要使用私钥解密数据的客户端。RSA 密钥对是在 iOS 上使用苹果提供的加密练习示例生成的。

在 base64Encoding 中生成的公钥和私钥(密钥长度为 1024)的长度分别为 216 和 844 字节,格式如下。

Private Key:
MIMAAnQwDQYJKoZIhvcNAQEBBQAkabeCYAAwggJbAgEAAoGBANDV3P+17zCIw/ZIwjM/5q7DeEEi4AVYE2STPnbuApvc0JjC3gx+F+mLtCfR+lxi0TAWqdFK6MkjGzyKONcEHRWxA/7ltFC1RlgEWzxmdr4kOEL5DV6DRep4Ykh4guvGf3A4N1A87com0rSjOoWR++N9HCmGxrnEhgV7gb9wknoRAgMBAAECgYAS+pyvEJXAT22fwFUF21TXpSQUp1q8oZiBl3Ah1ted2p+Kgoszj3IU44Fn7QlXxBNGz4h3YNtvDCWS3JVp1RHfZRonPdrvcwSMSk6M7crxS0NTxZlhvbgTuD2AlKjAT381gMUAxGGm9tvHlxwxhuIFEmXV1rz3hxbPYyFppCCrwQJBAd83wa9FwfGkcWU/gN3I0kJc8EfQwYDooY/V6hLcCYNW7wXyn3ja6Xl9XtgQnPeYSx+h2bGs339cDPKYtG2imm0CQG+PiLA8IHmIJDiEeB+jIRXAizd2aMgsvUomjWmMiYl/SPocvL3HxgGhvNNs8tUJKcw+/JhKPSBFX2+aRF55l7UCQQEZmVsQUs6P35De7T0dlrevVYvAt7QtuwXNTueYo4JXkosslJEPZJxTzs8f6ktC11Q1x1b0KGDBJ2dYW1GTJzzVAkBB6iq3Bi+h3wCXrB1VhAsOUR9we7PZYiXNZA31qSWyadRygvw5nYmueSOaQCi1Ep7xoN2aFXMcWCDVTe7La0hpAkBjBU9PDamhULFstd4hlx2UkPOGGnWZCAnr2zU+r2Q12eK20tjDZzS4TQWZWmKXkI2QAd+SJ44oI6+hZq5AHHEl

Public Key:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADkIJlKBgQDQ1dz/te8wiMP2SMIzP+auw3hBIuAFWBNkkz527gKb3NCYwt4Mfhfpi7Qn0fpcYtEwFqnRSujJIxmTFzjXBB0VsQP+5bRQtUZYBFs8Zna+JDhC+Q1eg0XqeGJIeILrxn9wODdQPO3KJtK0ozqFkfvjfRwphsa5xIYFe4G/cJJ6EQIDAQAB

在 iOS 世界中一切正常。

我正在尝试使用 Objective-c 在 MAC 中实现这一点,并发现加密练习示例没有按预期工作。SecItemCopyMatching 返回失败。

在调查解决方案时发现,使用 Open SSL 的公钥/私钥满足私钥和公钥的标准,但附加到生成的密钥对的页眉和页脚除外。

我使用 SSCrypto OpenSSL 包装器 ( http://septicus.com/products/opensource/ ) 使用 OpenSSL 生成公钥和私钥对,其形式为。

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCrEgoLjG34pNLj4ahpWlvXZZEhzimg/mJoKJLdrjE3Fg817Qf2
+iXTPMWAtmCkYgHn9Y99VJSdJzrb0/E1JnxMPva52ZMS8ilS/hSZnXRAlq2OPFMj
64SU9XDu/eWqJMULELNkBcTtPgTCAkjrDU6Qt2AbwNUwrgufJC8WJEhWdQIDAQAB
AoGBAKc2Y8E0C44dtdFvEgmge+MH8RuFA6XM4O2Es0Gh8ZMxqb6BKObdTbmzTi3o
loA3GDveB9puoTEXVm3nNX9JVfYr952+54vEfFGDnUfnsjpzQih5NkODKKxS0NXW
DsCgemo9QmOYlGUm/mcvdv2gnjrl/E1TgRbC5cJ8bX5O3sAhAkEA04mFvAx+B+mx
uVH8RxBkv0iB7lEuR87jrZuL7n7LnyHdnstK85xs9mmx95nMhmh6jWD1VIRVbx3X
XsRqoRVQjQJBAM8HER8bae89Vw6ptBezB3ihs4NZ/dF5jM3ksLN10hm9n00hSSmo
FaT7PcSizFkoUs2kGcytZuzTkSYVaeM154kCQQC6AXQJ7cYoeRJgjTnS1xRvqnct
sk6Kr949usepl+6+Z83zInkuiv65Eil+OcvA6D/S703p2k8xXMETQI0uRYrFAkBV
sIEftQMV6Pe9s/Q80vdGsPdSaM8sAvmKxxt0TFIYIWpsTFiyC0ZaMTuRxih6xrvv
LfsXwrYVVESB1N8tEkSxAkAbPNx57ceCLMvkknDWuNdygtBgtAskSccktWnbXk9C
CnpHn/toehb9Grk6pbR1PqLRgD2l8ctiYBq/+2t+L/lp
-----END RSA PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrEgoLjG34pNLj4ahpWlvXZZEh
zimg/mJoKJLdrjE3Fg817Qf2+iXTPMWAtmCkYgHn9Y99VJSdJzrb0/E1JnxMPva5
2ZMS8ilS/hSZnXRAlq2OPFMj64SU9XDu/eWqJMULELNkBcTtPgTCAkjrDU6Qt2Ab
wNUwrgufJC8WJEhWdQIDAQAB
-----END PUBLIC KEY-----

为了提取公钥,我去掉了“-----BEGIN PUBLIC KEY-----”和“-----END PUBLIC KEY-----”页脚和空格来提取公钥发送到服务器。

问题是,当我剥离页眉和页脚将公钥发送到服务器时,虽然服务器成功加密数据(使用公钥)并将加密数据发送到客户端,但使用私钥解密(PEM 格式) 使用 OpenSSL 失败。我认为解密失败,因为当我修改公钥的内容(通过剥离标头/食物)时,公钥和私钥被抓住成为密钥对。

有人可以帮助我解决方案,以便我能够使用私钥来解密收到的加密数据。

或者,有人可以帮助我使用objective-c api(由OpenSSL生成的对)生成上述长度的公钥/私钥对,这将解决我面临的问题吗?

感谢和问候。

服务器使用公钥加密的数据是 AES 密钥。使用公钥加密后的 AES 密钥大小为 176 个字符。这是执行此操作的代码片段。

public static String encryptAESKey(byte[] aesKeyBytes, String publicKeyStr) {
    String cipherStr = null; 

    try {
        PublicKey pkey = getPublicKey(publicKeyStr);

        final Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, pkey);

        byte[] cipherBytes = cipher.doFinal(aesKeyBytes);

        cipherStr = Base64.encodeBase64String(cipherBytes);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return cipherStr;
}

private static PublicKey getPublicKey(String publicKey) throws InvalidKeySpecException, NoSuchAlgorithmException {

    KeyFactory rsaKeyFac = KeyFactory.getInstance(RSA_ALGORITHM);
    byte[] keyBytes = Base64.decodeBase64(publicKey.getBytes());

    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);  
    RSAPublicKey rsaPubKey = (RSAPublicKey)rsaKeyFac.generatePublic(keySpec);
    return rsaPubKey;       
}
4

0 回答 0