2011-06-26 7 views
0

私はJavaでキーを作成しています。秘密鍵はPEM文字列でPKCS#8で暗号化されています。ここで 暗号化されたキーを使用してiOSで文字列に署名するには?

はPythonでM2Cryptoと秘密鍵を使用しての例です:

from M2Crypto import EVP, BIO 
privpem = "-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIICoTAbBgoqhkiG9w0BDAEDMA0ECFavEvdkv3fEAgEUBIICgAWvHvH6OktLiaaqo9v+X6XEuY3M\nZr465VmZWzP9nsbTqwSKQQjseiD/rWAxK7RS+V+hit5ZxlNRAUbkg0kwl8SRNX3v6q8noJtcB0OY\ndBEuNJDmWHMHh8qcnfRYc9WXPPmWdjQM2AkfZNfNOxHVlOMhancScy6P4h3Flri9VyUE8w2/zZqK\nBAd2w39V7gprCQXnnNenNuvr4p8MjsdBm8jh00o2HJzN0I6u+9s7M3qLXxwxNepptgU6Qt6eKHi6\njpsV/musVaohLhFMFAzQ87FeGvz/W8dyS9BtAKMRSuDu/QdWIJMRNKkPT0Tt1243V3tzXVXLjz0u\nm/FX6kfxL8r+eGtTr6NKTG75TJfooQzN/v08OEbmvYD/mfptmZ7uKezOGxDmgynn1Au7T/OxKFhx\nWZHpb9OFPIU0uiriUeyY9sbDVJ054zQ/Zd5+iaIjX5RsLoB4J+pfr4HuiVIZVj+Ss2rnPsOY3SjM\ntbHIFp/fLr/HODcDA5eYADRGpBIL9//Ejgzd7OqpU0mdajzZHcMTjeXfWB0cc769bFyHb3Ju1zNO\ng4gNN1H1kOMAXMF7p6r25f6v1BRS6bQyyiFz7Hs7h7JBylbBAgQJgZvv9Ea3XTMy+DIPMdepqu9M\nXazmmYJCtdLAfLBybWsfSBU5K6Pm6+Bwt6mPsuvYQBrP3h84BDRlbkntxUgaWmTB4dkmzhMS3gsY\nWmHGb1N+rn7xLoA70a3U/dUlI7lPkWBx9Sz7n8JlH3cM6jJUmUbmbAgHiyQkZ2mf6qo9qlnhOLvl\nFiG6AY+wpu4mzM6a4BiGMNG9D5rnNyD16K+p41LsliI/M5C36PKeMQbwjJKjmlmWDX0=\n-----END ENCRYPTED PRIVATE KEY-----\n" 

msg = "This is a message." 
privkeybio = BIO.MemoryBuffer(privpem) 
privkey = EVP.load_key_bio(privkeybio) #pw: 123456 
privkey.sign_init() 
privkey.sign_update(msg) 
print privkey.sign_final().encode('base64') 

そして、ここで私はJavaで(ヘッダーとフッターを剥離して)PEMを使用する方法の例です。

String msg = "This is a message."; 
String privpem = "MIICoTAbBgoqhkiG9w0BDAEDMA0ECFavEvdkv3fEAgEUBIICgAWvHvH6OktLiaaqo9v+X6XEuY3M\nZr465VmZWzP9nsbTqwSKQQjseiD/rWAxK7RS+V+hit5ZxlNRAUbkg0kwl8SRNX3v6q8noJtcB0OY\ndBEuNJDmWHMHh8qcnfRYc9WXPPmWdjQM2AkfZNfNOxHVlOMhancScy6P4h3Flri9VyUE8w2/zZqK\nBAd2w39V7gprCQXnnNenNuvr4p8MjsdBm8jh00o2HJzN0I6u+9s7M3qLXxwxNepptgU6Qt6eKHi6\njpsV/musVaohLhFMFAzQ87FeGvz/W8dyS9BtAKMRSuDu/QdWIJMRNKkPT0Tt1243V3tzXVXLjz0u\nm/FX6kfxL8r+eGtTr6NKTG75TJfooQzN/v08OEbmvYD/mfptmZ7uKezOGxDmgynn1Au7T/OxKFhx\nWZHpb9OFPIU0uiriUeyY9sbDVJ054zQ/Zd5+iaIjX5RsLoB4J+pfr4HuiVIZVj+Ss2rnPsOY3SjM\ntbHIFp/fLr/HODcDA5eYADRGpBIL9//Ejgzd7OqpU0mdajzZHcMTjeXfWB0cc769bFyHb3Ju1zNO\ng4gNN1H1kOMAXMF7p6r25f6v1BRS6bQyyiFz7Hs7h7JBylbBAgQJgZvv9Ea3XTMy+DIPMdepqu9M\nXazmmYJCtdLAfLBybWsfSBU5K6Pm6+Bwt6mPsuvYQBrP3h84BDRlbkntxUgaWmTB4dkmzhMS3gsY\nWmHGb1N+rn7xLoA70a3U/dUlI7lPkWBx9Sz7n8JlH3cM6jJUmUbmbAgHiyQkZ2mf6qo9qlnhOLvl\nFiG6AY+wpu4mzM6a4BiGMNG9D5rnNyD16K+p41LsliI/M5C36PKeMQbwjJKjmlmWDX0="; 
byte [] privkeybytes = Base64.decode(privpem); 

EncryptedPrivateKeyInfo encprivki = new EncryptedPrivateKeyInfo(privkeybytes); 

Cipher cipher = Cipher.getInstance(encprivki.getAlgName()); 
PBEKeySpec pbeKeySpec = new PBEKeySpec("123456".toCharArray()); 
SecretKeyFactory secFac = SecretKeyFactory.getInstance(encprivki.getAlgName()); 
Key pbeKey = secFac.generateSecret(pbeKeySpec); 
AlgorithmParameters algParams = encprivki.getAlgParameters(); 
cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams); 
KeySpec pkcs8KeySpec = encprivki.getKeySpec(cipher); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PrivateKey pk = kf.generatePrivate(pkcs8KeySpec); 

Signature sig = Signature.getInstance("SHA1withRSA"); 
sig.initSign(pk); 
sig.update(msg.getBytes("UTF8")); 
byte[] signatureBytes = sig.sign(); 
String b = Base64.encodeBytes(signatureBytes, Base64.DO_BREAK_LINES); 
System.out.println(b); // Display the string. 

これはiOSでどのように行われますか?私はCryptoExercise、特にSecKeyWrapperを見てきましたが、そこにはたくさんのことがあり、それは私を超えています。

私は個人的にiOS開発を行っているつもりはありませんが、開発者に少なくとも多かれ少なかれそれを行う方法を示すためのコードが必要です。開発者はUIタイプであり、暗号に慣れていません。 (どちらも私は違いますが、それは別の話です...)

私たちは、文字列公開鍵PEMとの署名を検証する方法は? JavaとPythonの例はここには載せませんが、かなり単純です。

答えて

0

私は先週同じ問題がありました。 iOS上のCommonCryptライブラリは、対称鍵の暗号化には非常に優れていますが、単純な公開鍵の処理を行うには鍵リングを扱うのが面倒です。私はちょうどOpenSSLを含んでいた。 OpenSSL-Xcodeこれを設定するのは些細なことでした。プロジェクトとOpenSSLのtarballをドロップして、libsslとリンクするようにターゲットを設定してください。

OpenSSLコードはM2Cryptoコードとほぼ同じです。

+0

これは有望そうです。何らかの(疑似)コードを投稿する可能性はありますか?私はCもObjective Cも知っていないので、ドキュメントやいくつかのオンラインの例を見ていても、私は「ここでそれを行う方法」の例に近いとは言えません。 –

関連する問題