当前位置:   article > 正文

获取Android签名证书的公钥和私钥

安卓的证书别名和证书的私钥密码怎么获取

本文以Android签名JKS格式的证书为例:

  1. package com.test;
  2. import java.io.FileInputStream;
  3. import java.security.Key;
  4. import java.security.KeyStore;
  5. import java.security.PrivateKey;
  6. import java.security.PublicKey;
  7. import javax.crypto.Cipher;
  8. public class SignTest {
  9. public static void main(String[] args) {
  10. try {
  11. // 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
  12. FileInputStream fis2 = new FileInputStream("G:\\shanhytest.keystore");
  13. KeyStore ks = KeyStore.getInstance("JKS"); // 加载证书库
  14. char[] kspwd = "shanhytest".toCharArray(); // 证书库密码
  15. char[] keypwd = "shanhytest".toCharArray(); // 证书密码
  16. String alias = "shanhytest";// 别名
  17. ks.load(fis2, kspwd); // 加载证书
  18. PrivateKey privateKey = (PrivateKey) ks.getKey(alias, keypwd); // 获取证书私钥
  19. PublicKey publicKey = ks.getCertificate(alias).getPublicKey();// 获取证书公钥
  20. fis2.close();
  21. System.out.println("privateKey = " + getKeyString(privateKey));
  22. System.out.println("publicKey = " + getKeyString(publicKey));
  23. // 测试加密解密字符串
  24. String srcContent = "今天天气不错。";
  25. // 将字符串使用公钥加密后,再用私钥解密后,验证是否能正常还原。
  26. // 因为非对称加密算法适合对小数据量的数据进行加密和解密,而且性能比较差,所以在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
  27. byte[] d1 = crypt(publicKey, srcContent.getBytes(), Cipher.ENCRYPT_MODE);
  28. byte[] d2 = crypt(privateKey, d1, Cipher.DECRYPT_MODE);
  29. System.out.println(new String(d2));
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. /**
  35. * 将KEY转换为字符串
  36. *
  37. * @param key
  38. * @return
  39. * @author SHANHY
  40. * @date 2015年11月21日
  41. */
  42. private static String getKeyString(Key key) {
  43. byte[] keyBytes = key.getEncoded();
  44. String s = new String(org.apache.commons.codec.binary.Base64.encodeBase64(keyBytes));
  45. return s;
  46. }
  47. /**
  48. * 加密/解密
  49. *
  50. * @param key
  51. * 私钥打包成byte[]形式
  52. * @param data
  53. * 要解密的数据
  54. * @param opmode
  55. * 操作类型(Cipher.DECRYPT_MODE为解密,Cipher.ENCRYPT_MODE为加密)
  56. * @return 解密数据
  57. */
  58. public static byte[] crypt(Key key, byte[] data, int opmode) {
  59. try {
  60. long startTime = System.currentTimeMillis();
  61. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//jdk默认标准
  62. // Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");// android默认标准
  63. cipher.init(opmode, key);
  64. byte[] result = cipher.doFinal(data);
  65. System.out.println((Cipher.DECRYPT_MODE==opmode?"解密":"加密") + "耗时:" + (System.currentTimeMillis() - startTime));
  66. return result;
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. }
  70. return null;
  71. }
  72. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/335553
推荐阅读
相关标签
  

闽ICP备14008679号