<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>
java ecc加密是什么,让我们一起了解一下:
ecc是椭圆曲线密码,利用椭圆曲线来实现的密码技术的统称,java中ecc加密通过使用JPBC库调用ECC椭圆曲线加解密算法,能够编写简单的实验代码进行正确的ECC加密和解密。
为什么使用椭圆曲线加密算法?
RSA的解决分解整数问题需要亚指数时间复杂度的算法,而目前已知计算椭圆曲线离散对数问题(ECDLP)的最好方法都需要全指数时间复杂度。这意味着在椭圆曲线系统中我们只需要使用相对于RSA 短得多的密钥就可以达到与其相同的安全强度。
例如,一般认为160比特的椭圆曲线密钥提供的安全强度与1024比特RSA密钥相当。使用短的密钥的好处在于加解密速度快、节省能源、节省带宽、存储空间。
比特币以及中国的二代身份证都使用了256 比特的椭圆曲线密码算法。
ecc算法的过程是怎样的?
1、公私钥生成:
Alice首先构造一条椭圆曲线 E E E,在曲线上选择一点 G G G作为生成元,并求 G G G的阶为 n n n,要求 n n n必须为质数。
Alice选择一个私钥 k ( k < n ) k (k < n) k(k<n),生成公钥 Q = k G Q = kG Q=kG。
Alice将公钥组 E 、 Q 、 G E、Q、G E、Q、G发送给Bob。
2、加密过程:
Bob收到信息后,将明文编码为 M M M, M M M为曲线上一点,并选择一个随机数 r r r( r < n , n r < n, n r<n,n为 G G G的阶)。
Bob计算点 C i p h e r 1 Cipher1 Cipher1与 C i p h e r 2 Cipher2 Cipher2即两段密文,计算方法如下:
C i p h e r 1 = M + r Q Cipher1 = M + rQ Cipher1=M+rQ
C i p h e r 2 = r G Cipher2 = rG Cipher2=rG
Bob把 C i p h e r 1 Cipher1 Cipher1和 C i p h e r 2 Cipher2 Cipher2发给Alice。
3、解密过程:
Alice收到密文后,为了获得 M M M,只需要 C i p h e r 1 ? k ? C i p h e r 2 Cipher1 - k · Cipher2 Cipher1?k?Cipher2,因为
C i p h e r 1 ? k ? C i p h e r 2 = M + r Q ? k r G = M + r k G ? k r G = M Cipher1 - k*Cipher2 = M + rQ - krG = M + rkG - krG = M Cipher1?k?Cipher2=M+rQ?krG=M+rkG?krG=M。将M解码即可。
java ecc加密具体代码展示:
//加密算法public static String encrypt(Element P_b, String data, int k, Element P_t, Element G){ try { byte[] datasource=data.getBytes("utf8"); String CArray = "A"; //计算P_1 Element P_1 = G.duplicate().getImmutable().mul(k); System.out.println("加密过程中计算出的P_1:"+ P_1); //计算P_2 Element P_2 = P_b.duplicate().getImmutable().mul(k); System.out.println("加密过程中计算出的P_2:"+ P_2); //计算P_end Element P_end = P_t.add(P_2); System.out.println("加密过程中计算出的P_end:"+ P_end); //计算密文C String[] p_txy = P_t.toString().split(","); BigInteger p_tx = new BigInteger(p_txy[0]); BigInteger p_ty = new BigInteger(p_txy[1]); for(int i=0;i<datasource.length;i++) { BigInteger M = new BigInteger(datasource[i]+""); BigInteger C_mid = M.multiply(p_tx).add(p_ty); CArray = CArray +","+C_mid.toString(); } CArray = CArray + ",,"+ Base64.getEncoder().encodeToString(P_1.toCanonicalRepresentation())+",,"+ Base64.getEncoder().encodeToString(P_end.toCanonicalRepresentation()); return Base64.getEncoder().encodeToString(CArray.getBytes()); } catch(Exception ex) { ex.printStackTrace(); } return null;}