當前位置:生活全書館 >

IT科技

> ecc加密 java

ecc加密 java

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

標籤: ecc 加密 java
  • 文章版權屬於文章作者所有,轉載請註明 https://shqsg.com/dianzi/1o4g56.html