当前位置:科普知识站>IT科技>

java|ecc加密

IT科技 阅读(3.11W)

<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 比特的椭圆曲线密码算法。

java ecc加密

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;}