3

クライアント/サーバーベースのアプリケーションがあります。クライアントは、iOS と OSX の両方用に開発されています。サーバーは両方のクライアントに共通です (サーバーの実装は変更できません)。

iOS で開発されたクライアントは、RSA 公開鍵と秘密鍵のペアを生成し、公開鍵を base64 エンコーディングでサーバーに送信します。サーバー (Java で実装) は、一部の安全なデータを暗号化し、秘密鍵でデータを復号化する必要があるクライアントに同じデータを送信します。RSA キー ペアは、Apple が提供する Crypto Exercise Sample を使用して 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 にこれを実装しようとしていますが、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 の使用は失敗します。公開鍵のコンテンツを(ヘッダー/フッターを削除して)変更すると、公開鍵と秘密鍵が鍵のペアになるため、復号化に失敗したと思います。

秘密鍵を使用して受信した暗号化されたデータを復号化できるように、誰かが解決策を手伝ってくれませんか。

あるいは、私が直面している問題を解決する目的の 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