2011-06-26 62 views
0

我有用Java创建的键。私钥是在PEM字符串中加密的PKCS#8。如何使用加密密钥在iOS下签名字符串?

下面是使用与M2Crypto私钥在Python的例子:

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,所以尽管看了一些文档和一些在线的例子,但我并没有那么接近于“这里是怎么做”的例子。 –

相关问题