ECC
ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生。

   
当我开始整理《Java加密技术(二)》的时候,我就已经在开始研究ECC了,但是关于Java实现ECC算法的资料实在是太少了,无论是国内还是国外的资料,无论是官方还是非官方的解释,最终只有一种答案——ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析。 如果想要获得ECC算法实现,需要调用硬件完成加密/解密(ECC算法相当耗费资源,如果单纯使用CPU进行加密/解密,效率低下),涉及到Java Card领域,PKCS#11。 其实,PKCS#11配置很简单,但缺乏硬件设备,无法尝试!



    尽管如此,我照旧提供相应的Java实现代码,以供大家参考。



通过java代码实现如下:Coder类见 Java加密技术(一)

  1. import java.math.BigInteger;
  2. import java.security.Key;
  3. import java.security.KeyFactory;
  4. import java.security.interfaces.ECPrivateKey;
  5. import java.security.interfaces.ECPublicKey;
  6. import java.security.spec.ECFieldF2m;
  7. import java.security.spec.ECParameterSpec;
  8. import java.security.spec.ECPoint;
  9. import java.security.spec.ECPrivateKeySpec;
  10. import java.security.spec.ECPublicKeySpec;
  11. import java.security.spec.EllipticCurve;
  12. import java.security.spec.PKCS8EncodedKeySpec;
  13. import java.security.spec.X509EncodedKeySpec;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. import javax.crypto.Cipher;
  17. import javax.crypto.NullCipher;
  18. import sun.security.ec.ECKeyFactory;
  19. import sun.security.ec.ECPrivateKeyImpl;
  20. import sun.security.ec.ECPublicKeyImpl;
  21. /**
  22. * ECC安全编码组件
  23. *
  24. * @author 梁栋
  25. * @version 1.0
  26. * @since 1.0
  27. */
  28. public abstract class ECCCoder extends Coder {
  29. public static final String ALGORITHM = "EC";
  30. private static final String PUBLIC_KEY = "ECCPublicKey";
  31. private static final String PRIVATE_KEY = "ECCPrivateKey";
  32. /**
  33. * 解密<br>
  34. * 用私钥解密
  35. *
  36. * @param data
  37. * @param key
  38. * @return
  39. * @throws Exception
  40. */
  41. public static byte[] decrypt(byte[] data, String key) throws Exception {
  42. // 对密钥解密
  43. byte[] keyBytes = decryptBASE64(key);
  44. // 取得私钥
  45. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  46. KeyFactory keyFactory = ECKeyFactory.INSTANCE;
  47. ECPrivateKey priKey = (ECPrivateKey) keyFactory
  48. .generatePrivate(pkcs8KeySpec);
  49. ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(priKey.getS(),
  50. priKey.getParams());
  51. // 对数据解密
  52. // TODO Chipher不支持EC算法 未能实现
  53. Cipher cipher = new NullCipher();
  54. // Cipher.getInstance(ALGORITHM, keyFactory.getProvider());
  55. cipher.init(Cipher.DECRYPT_MODE, priKey, ecPrivateKeySpec.getParams());
  56. return cipher.doFinal(data);
  57. }
  58. /**
  59. * 加密<br>
  60. * 用公钥加密
  61. *
  62. * @param data
  63. * @param privateKey
  64. * @return
  65. * @throws Exception
  66. */
  67. public static byte[] encrypt(byte[] data, String privateKey)
  68. throws Exception {
  69. // 对公钥解密
  70. byte[] keyBytes = decryptBASE64(privateKey);
  71. // 取得公钥
  72. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  73. KeyFactory keyFactory = ECKeyFactory.INSTANCE;
  74. ECPublicKey pubKey = (ECPublicKey) keyFactory
  75. .generatePublic(x509KeySpec);
  76. ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(pubKey.getW(),
  77. pubKey.getParams());
  78. // 对数据加密
  79. // TODO Chipher不支持EC算法 未能实现
  80. Cipher cipher = new NullCipher();
  81. // Cipher.getInstance(ALGORITHM, keyFactory.getProvider());
  82. cipher.init(Cipher.ENCRYPT_MODE, pubKey, ecPublicKeySpec.getParams());
  83. return cipher.doFinal(data);
  84. }
  85. /**
  86. * 取得私钥
  87. *
  88. * @param keyMap
  89. * @return
  90. * @throws Exception
  91. */
  92. public static String getPrivateKey(Map<String, Object> keyMap)
  93. throws Exception {
  94. Key key = (Key) keyMap.get(PRIVATE_KEY);
  95. return encryptBASE64(key.getEncoded());
  96. }
  97. /**
  98. * 取得公钥
  99. *
  100. * @param keyMap
  101. * @return
  102. * @throws Exception
  103. */
  104. public static String getPublicKey(Map<String, Object> keyMap)
  105. throws Exception {
  106. Key key = (Key) keyMap.get(PUBLIC_KEY);
  107. return encryptBASE64(key.getEncoded());
  108. }
  109. /**
  110. * 初始化密钥
  111. *
  112. * @return
  113. * @throws Exception
  114. */
  115. public static Map<String, Object> initKey() throws Exception {
  116. BigInteger x1 = new BigInteger(
  117. "2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8", 16);
  118. BigInteger x2 = new BigInteger(
  119. "289070fb05d38ff58321f2e800536d538ccdaa3d9", 16);
  120. ECPoint g = new ECPoint(x1, x2);
  121. // the order of generator
  122. BigInteger n = new BigInteger(
  123. "5846006549323611672814741753598448348329118574063", 10);
  124. // the cofactor
  125. int h = 2;
  126. int m = 163;
  127. int[] ks = { 7, 6, 3 };
  128. ECFieldF2m ecField = new ECFieldF2m(m, ks);
  129. // y^2+xy=x^3+x^2+1
  130. BigInteger a = new BigInteger("1", 2);
  131. BigInteger b = new BigInteger("1", 2);
  132. EllipticCurve ellipticCurve = new EllipticCurve(ecField, a, b);
  133. ECParameterSpec ecParameterSpec = new ECParameterSpec(ellipticCurve, g,
  134. n, h);
  135. // 公钥
  136. ECPublicKey publicKey = new ECPublicKeyImpl(g, ecParameterSpec);
  137. BigInteger s = new BigInteger(
  138. "1234006549323611672814741753598448348329118574063", 10);
  139. // 私钥
  140. ECPrivateKey privateKey = new ECPrivateKeyImpl(s, ecParameterSpec);
  141. Map<String, Object> keyMap = new HashMap<String, Object>(2);
  142. keyMap.put(PUBLIC_KEY, publicKey);
  143. keyMap.put(PRIVATE_KEY, privateKey);
  144. return keyMap;
  145. }
  146. }

请注意上述代码中的TODO内容,再次提醒注意,Chipher不支持EC算法 ,以上代码仅供参考。Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey均不支持EC算法。为了确保程序能够正常执行,我们使用了NullCipher类,验证程序。



照旧提供一个测试类:

  1. import static org.junit.Assert.*;
  2. import java.math.BigInteger;
  3. import java.security.spec.ECFieldF2m;
  4. import java.security.spec.ECParameterSpec;
  5. import java.security.spec.ECPoint;
  6. import java.security.spec.ECPrivateKeySpec;
  7. import java.security.spec.ECPublicKeySpec;
  8. import java.security.spec.EllipticCurve;
  9. import java.util.Map;
  10. import org.junit.Test;
  11. /**
  12. *
  13. * @author 梁栋
  14. * @version 1.0
  15. * @since 1.0
  16. */
  17. public class ECCCoderTest {
  18. @Test
  19. public void test() throws Exception {
  20. String inputStr = "abc";
  21. byte[] data = inputStr.getBytes();
  22. Map<String, Object> keyMap = ECCCoder.initKey();
  23. String publicKey = ECCCoder.getPublicKey(keyMap);
  24. String privateKey = ECCCoder.getPrivateKey(keyMap);
  25. System.err.println("公钥: \n" + publicKey);
  26. System.err.println("私钥: \n" + privateKey);
  27. byte[] encodedData = ECCCoder.encrypt(data, publicKey);
  28. byte[] decodedData = ECCCoder.decrypt(encodedData, privateKey);
  29. String outputStr = new String(decodedData);
  30. System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);
  31. assertEquals(inputStr, outputStr);
  32. }
  33. }

控制台输出:

    1. 公钥:
    2. MEAwEAYHKoZIzj0CAQYFK4EEAAEDLAAEAv4TwFN7vBGsqgfXk95ObV5clO7oAokHD7BdOP9YMh8u
    3. gAU21TjM2qPZ
    4. 私钥:
    5. MDICAQAwEAYHKoZIzj0CAQYFK4EEAAEEGzAZAgEBBBTYJsR3BN7TFw7JHcAHFkwNmfil7w==
    6. 加密前: abc
    7. 解密后: abc

ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学的更多相关文章

  1. [区块链] 密码学——椭圆曲线密码算法(ECC)

    今天在学椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法,自己手里缺少介绍该算法的专业书籍,故在网上查了很多博文与书籍,但是大多数博客写的真的是...你懂的...真不 ...

  2. ECC(Ellipse Curve Cryptography)+AES(Advanced Encryption Standard)前端通讯加密模拟(使用eccrypto-js)

    前置知识 不了解对称加密与非对称加密的小伙伴可以看看下面的文章,想详细学习与区块链有关的加密算法可以戳这里 对称与非对称加密 https://blog.csdn.net/u013320868/arti ...

  3. 加密算法大全图解 :密码体系,对称加密算法,非对称加密算法,消息摘要, Base64,数字签名,RSA,DES,MD5,AES,SHA,ElGamal,

    1. 加密算法大全: ***************************************************************************************** ...

  4. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  5. Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

    Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC 博客分类: Java/Security Javabase64macmd5sha     加密解密,曾经是我一 ...

  6. IOS开发之—— 各种加密的使用(MD5,base64,DES,AES)

    基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm ...

  7. BASE64与单向加密算法MD5&SHA&MAC

    言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Diges ...

  8. java中几种加/解密API

    如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorit ...

  9. Java加密技术(一)——加密介绍

    from://http://blog.csdn.net/janronehoo/article/details/7590772 如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 ...

随机推荐

  1. webpack-dev-server轻量级js高速打包、热部署服务器

    webpack是一个打包web项目的工具 ,可以实现css,js,less,cass,html的混淆加密,minify,结合webpack-dev-server热部署,非常方便前端页面和Nodejs的 ...

  2. 好玩的Handler

    Android提供了Handler和Looper来满足线程间的通信; Handler和Activity的任务栈不同,它是先进先出原则; Handler:你可以构造Handler对象来与Looper沟通 ...

  3. Android笔记——Android自定义控件

    目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果 ...

  4. SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)

    今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...

  5. GNU Readline 库及编程简介

    用过 Bash 命令行的一定知道,Bash 有几个特性: TAB 键可以用来命令补全 ↑ 或 ↓ 键可以用来快速输入历史命令 还有一些交互式行编辑快捷键: C-A / C-E 将光标移到行首/行尾 C ...

  6. Angularjs+node+Mysql实现地图上的多点标注

    注:本文适合对于node有一定基础的人,如果您是小白,请先用1个小时学习node.node文档https://nodejs.org/en/docs/ 该片博文的源码地址:https://github. ...

  7. call和apply的区别

    call和apply都属于function prototype的一个方法. 定义:调用一个方法的对象,以另一个对象替换当前对象. 相同点:两个方法产生的作用是一样的. 不同点:方法传递的参数不同. c ...

  8. commons configuration管理项目的配置文件

    Commons Confifutation commons configuration可以很方便的访问配置文件和xml文件中的的内容.Commons Configuration 是为了提供对属性文件. ...

  9. Dubbo_异常_Service启动时默认将方法注册到内网IP

    一.背景 一般Dubbo服务都是通过内网调用,Dubbo服务启动时默认会将服务注册到内网IP,消费端就无法从外网访问. 二.解决过程 1.Linux的hosts中设置外网IP a) 通过hostnam ...

  10. jquery获取url参数及url加参数的方法

    转--http://www.jb51.net/article/73896.htm <script src="js/jquery-1.7.2.min.js" type=&quo ...