2011-09-16 87 views
2

我想在java中实现椭圆曲线加密(ECC),因为java 7提供支持椭圆曲线加密(ECC)的本机提供商SunEC 但是我总是收到错误java.security。 InvalidKeyException:无效的密钥长度:91个字节,因为我创建的椭圆曲线 不合适。Java 7中的椭圆曲线加密实现

我使用的Java 7我的任务就是用ECC生成用于加密和解密

package com.acc; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.PrivateKey; 
import java.security.Provider; 
import java.security.PublicKey; 
import java.security.SecureRandom; 
import java.security.Security; 
import java.security.Signature; 
import java.security.spec.ECGenParameterSpec; 
import java.security.spec.ECParameterSpec; 
import java.security.spec.EllipticCurve; 

import javax.crypto.Cipher; 
import javax.crypto.CipherInputStream; 
import javax.crypto.CipherOutputStream; 
import javax.crypto.spec.DESKeySpec; 


public class TestECC { 

    public static void main(String args[]) { 
     try { 
      Provider p[] = Security.getProviders(); 
      Provider p1 = Security.getProvider("SunEC"); 
      System.out.println(p1.getName()); 
      KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "SunEC"); 
      System.out.println(kpg.getAlgorithm()); 

      Cipher cipher = Cipher.getInstance("DES"); 
      System.out.println("provider=" + cipher.getProvider()); 

      ECGenParameterSpec ecsp = new ECGenParameterSpec("sect163r2"); 

      kpg.initialize(ecsp); 
      KeyPair kyp = kpg.genKeyPair(); 
      PublicKey pubKey = kyp.getPublic(); 

      PrivateKey privKey = kyp.getPrivate(); 
      System.out.println(cipher.getProvider()); 

      cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

      String cleartextFile = "cleartext.txt"; 
      String ciphertextFile = "ciphertextECIES.txt"; 

      byte[] block = new byte[64]; 
      FileInputStream fis = new FileInputStream(cleartextFile); 
      FileOutputStream fos = new FileOutputStream(ciphertextFile); 
      CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

      int i; 
      while ((i = fis.read(block)) != -1) { 
       cos.write(block, 0, i); 
      } 
      cos.close(); 

      // Decrypt 

      String cleartextAgainFile = "cleartextAgainECIES.txt"; 

      cipher.init(Cipher.DECRYPT_MODE, privKey, ecsp); 

      fis = new FileInputStream(ciphertextFile); 
      CipherInputStream cis = new CipherInputStream(fis, cipher); 
      fos = new FileOutputStream(cleartextAgainFile); 

      while ((i = cis.read(block)) != -1) { 
       fos.write(block, 0, i); 
      } 
      fos.close(); 

     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 

} 

输出键: SunEC EC 提供商=了SunJCE版本1.7 了SunJCE 1.7版本 java.security。 InvalidKeyException:无效的密钥长度:91字节

能否请您帮助ECC曲线和算法使用

+0

你确定你的Java实现支持SEC 2椭圆曲线域“sect163r2”吗? – darvids0n

+0

请问您可以帮助ECC曲线和算法使用 – Akash

+0

为什么不使用BouncyCastle库? – Tair

回答

5

从我读,你想:

  • 使用ECC
  • 生成随机密钥对
  • 使用ECC私钥加密
  • 使用ECC公钥作为DES一个DES对称密钥解密
  • 对称密钥希望得到的结果是往返

这是行不通的 - DES是一种对称算法;它要求使用相同的56位密钥进行加密和解密。抛出一个ECC密钥不会让它接受两个操作的不同密钥!

+0

你可以请求帮助ECC曲线和算法使用 我只想写一个简单的程序在JDK 1.7使用ECC,我想使用ECC作为Keygenerator – Akash

2

由于暮色已经指出你不能混合椭圆曲线和DES加密。

问题是新的SunEC提供商确实是only implement Elliptic Curve Diffie-Hellman (ECDH) and Elliptic Curve Digital Signature Algorithm (ECDSA)

使用EC的加密标准为Elliptic Curve Integrated Encryption Scheme (ECIES) - 这在Java 7中未实现。因此,如果不使用外部库,则无法使用EC进行加密。

+0

谢谢Robert :) 但在java 7安全增强它提到它有ECC的提供者。 也可以在这种情况下使用ECDH进行加密 – Akash

+0

如果ECDH真的有效,您应该能够从中创建一个密码实例:密码cipher = Cipher.getInstance(“ECDH”); – Robert

+0

到目前为止,我明白我可以使用ECC进行签名,但不能用于加密和解密,这是正确的 – Akash

0

你可以做的是用ECDH交换一个秘密的对称密钥,然后你可以使用它来加密和解密DES。