服务器中的Java中的OpenSSL RSA公钥加密和OSX中的客户端中的私钥解密

时间:2013-08-18 17:34:55

标签: macos openssl rsa

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

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

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中实现这一点,并发现Crypto Exercise示例未按预期工作。 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失败。 我认为解密失败了,因为当我修改公钥的内容时(通过剥离标头/ fooders),公钥和私钥被抓住是密钥对。

有人可以帮我解决这个问题,以便我能够使用私钥来解密收到的加密数据。

或者,有人可以使用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;       
}

0 个答案:

没有答案