2013-10-18 40 views
0

我一直試圖從RSA切換到ECC在我的代碼。起初,我嘗試過使用Bouncycastle,但是我在命名曲線上工作時遇到了困難。我找到的示例代碼都沒有工作。20使用橢圓曲線加密的字節限制

所以我試過JECC,它工作得很好,除了一個問題。當使用「secp256r1」曲線時,我只能編碼20個字節,160位,然後它給我一個「索引超出範圍」的錯誤。

這是與一般JECC,橢圓曲線的限制,也許我自己的代碼?我試着在線研究這個問題,並且找不到任何有關256位ECC密鑰可以編碼多少數據的參考。使用RSA,我可以編碼小於所用密鑰的任何數據。

此外,ECC的數據填充有多重要?我找不到關於ECC的標準填充實踐的任何信息。

非常感謝您的幫助。

編輯: 這裏是我的代碼,如果你不知道。我稍微修改了原始的JACC代碼,所以沒有任何類型轉換。

ECCryptoSystem cs = new ECCryptoSystem(new EllipticCurve(new secp256r1())); 

t1=System.currentTimeMillis(); 
ECKey sk = cs.generateKey(); // secure key 
ECKey pk = sk.getPublic(); // public key 
t2=System.currentTimeMillis(); 
System.out.println("Generated keys in "+(t2-t1)+"ms."); 

for(int c=0;c<10;c++){ 
    t1=System.currentTimeMillis(); 
    byte[] s1=args[0].getBytes(); 
    byte[] s2=cs.encrypt(s1,args[0].length(),pk); 
    byte[] s3=cs.decrypt(s2,sk); 
    t2=System.currentTimeMillis(); 

    if(Arrays.equals(s1,s2)){System.out.println("Bad encryption!");} 
    if(!Arrays.equals(s1,s3)){System.out.println("Bad decryption!");} 

    String decoded = new String(s3, "UTF-8"); 
    System.out.println("loop "+(c+1)+": \""+decoded+"\" ("+decoded.length()+" Characters) in "+(t2-t1)+"ms."); 
} 

這裏就是我如何運行它:

$ java Mecc "This is a good test." 
Generated keys in 397ms. 
loop 1: "This is a good test." (20 Characters) in 208ms. 
loop 2: "This is a good test." (20 Characters) in 107ms. 
loop 3: "This is a good test." (20 Characters) in 69ms. 
loop 4: "This is a good test." (20 Characters) in 68ms. 
loop 5: "This is a good test." (20 Characters) in 73ms. 
loop 6: "This is a good test." (20 Characters) in 59ms. 
loop 7: "This is a good test." (20 Characters) in 64ms. 
loop 8: "This is a good test." (20 Characters) in 58ms. 
loop 9: "This is a good test." (20 Characters) in 60ms. 
loop 10: "This is a good test." (20 Characters) in 60ms. 
$ java Mecc "This is a good test.." 
Generated keys in 555ms. 
Error: java.lang.ArrayIndexOutOfBoundsException: 20 

FYI:你可以看到JIT編譯器的幾個循環後,如何加快東西。

另一個編輯: 我只是通過JECC碼加強,發現一些有趣的事情:

hash = MessageDigest.getInstance("SHA-1"); 
... 
byte[] digest = hash.digest(); 
for(int j = 0; j < numbytes; j++) { 
    res[j+ek.mother.getPCS()]=(byte) (input[j]^digest[j]); 
} 

看來數據對散列進行XOR運算。如果我將「SHA-1」更改爲「SHA-256」,我不會再發生錯誤。

現在我不是一個密碼專家,我寧可不改變JECC的核心功能,但是這是一個有效的解決方案?

+0

我想堅持JECC,而不是使用BouncyCastle的,因爲JECC更加緊湊,只需要稍加調整後,9班。然而,這個錯誤發生在我修改任何JECC代碼之前。 – Mick

+0

除非我錯了,否則JECC實際上不會執行任何橢圓曲線密碼學,而是將數據與密鑰的散列進行XOR。你可以看到它在文件「ECCryptoSystem.java」中做了什麼, – Mick

回答

0

之所以JECC只有加密的20個字節的明文是,在加密過程中它試圖XOR與摘要值的輸入端。 JECC使用的SHA-1的摘要長度爲160位(20字節)。

而且JECC不使用ECC不加密的數據,而這是一個原型ECIES的,它涉及到使用生成的Diffie ECC Hellman密鑰交換對稱密鑰和使用任何自定義的對稱加密算法。