java ecc加密是什么,讓我們一起了解一下:
ecc是橢圓曲線密碼,利用橢圓曲線來實(shí)現(xiàn)的密碼技術(shù)的統(tǒng)稱,java中ecc加密通過使用JPBC庫調(diào)用ECC橢圓曲線加解密算法,能夠編寫簡單的實(shí)驗(yàn)代碼進(jìn)行正確的ECC加密和解密。
為什么使用橢圓曲線加密算法?
RSA的解決分解整數(shù)問題需要亞指數(shù)時(shí)間復(fù)雜度的算法,而目前已知計(jì)算橢圓曲線離散對(duì)數(shù)問題(ECDLP)的最好方法都需要全指數(shù)時(shí)間復(fù)雜度。這意味著在橢圓曲線系統(tǒng)中我們只需要使用相對(duì)于RSA 短得多的密鑰就可以達(dá)到與其相同的安全強(qiáng)度。
例如,一般認(rèn)為160比特的橢圓曲線密鑰提供的安全強(qiáng)度與1024比特RSA密鑰相當(dāng)。使用短的密鑰的好處在于加解密速度快、節(jié)省能源、節(jié)省帶寬、存儲(chǔ)空間。
比特幣以及中國的二代身份證都使用了256 比特的橢圓曲線密碼算法。
ecc算法的過程是怎樣的?
1、公私鑰生成:
Alice首先構(gòu)造一條橢圓曲線 E E E,在曲線上選擇一點(diǎn) G G G作為生成元,并求 G G G的階為 n n n,要求 n n n必須為質(zhì)數(shù)。
Alice選擇一個(gè)私鑰 k ( k < n ) k (k < n) k(k Alice將公鑰組 E 、 Q 、 G E、Q、G E、Q、G發(fā)送給Bob。 2、加密過程: Bob收到信息后,將明文編碼為 M M M, M M M為曲線上一點(diǎn),并選擇一個(gè)隨機(jī)數(shù) r r r( r < n , n r < n, n r Bob計(jì)算點(diǎn) C i p h e r 1 Cipher1 Cipher1與 C i p h e r 2 Cipher2 Cipher2即兩段密文,計(jì)算方法如下: 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發(fā)給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,因?yàn)?/p> 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";
????????//計(jì)算P_1
????????Element?P_1?=?G.duplicate().getImmutable().mul(k);
????????System.out.println("加密過程中計(jì)算出的P_1:"+?P_1);
????????//計(jì)算P_2
????????Element?P_2?=?P_b.duplicate().getImmutable().mul(k);
????????System.out.println("加密過程中計(jì)算出的P_2:"+?P_2);
????????//計(jì)算P_end
????????Element?P_end?=?P_t.add(P_2);
????????System.out.println("加密過程中計(jì)算出的P_end:"+?P_end);
????????//計(jì)算密文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