【问题标题】:InvalidKeyException using ECPublicKey使用 ECPublicKey 的 InvalidKeyException
【发布时间】:2015-07-18 04:19:31
【问题描述】:

当我尝试使用 EC 公钥加密字节数组时出现以下异常:

java.security.InvalidKeyException:没有安装的提供程序支持这个 钥匙: sun.security.ec.ECPublicKeyImpl

当我调用Cipher.init() 时会产生此异常。以下几行显示了我在程序中所做的:

ECPublicKey publicKey ;
ECPrivateKey privateKey;

//Generating key paire (public and private keys) 
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", "SunEC");
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");

    keyGen.initialize(571, random);
    KeyPair pair = keyGen.generateKeyPair();
    privateKey = (ECPrivateKey) pair.getPrivate();
    publicKey = (ECPublicKey) pair.getPublic();

// get an AES cipher object with CTR encription mode 
   Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

// encrypt the sharedSecret using the public key
   cipher.init(Cipher.ENCRYPT_MODE, publicKey);**
   byte[] result = cipher.doFinal(data);

我必须添加一个提供程序来支持这个公钥吗?

【问题讨论】:

    标签: java encryption public-key-encryption pki key-generator


    【解决方案1】:

    最后,我找到了这个异常的来源。问题是密码的初始化:

    //This is the wrong initialization
    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
    
    //This is the right initialization
    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding","SunJCE");
    

    但是现在,我有另一个例外(它不如前一个重要):

    java.security.InvalidKeyException: Invalid AES key length: 170 bytes
    

    那么我现在必须使用什么作为 ECDSA 公钥的加密算法?

    【讨论】:

      【解决方案2】:

      ECDSA 不用于加密 而是您使用 RSA / 对称密码

      【讨论】:

        【解决方案3】:
          KeyGenerator keygen = KeyGenerator.getInstance("AES");
          keygen.init(128);
          key = keygen.generateKey();
        String plain_input = "Hush-a-bye, baby, on the tree top,When the wind blows" ; 
          //encryption
          cipher = Cipher.getInstance(""AES/EBC/PKCS5Padding");
          cipher.init(Cipher.ENCRYPT_MODE, key);
          byte[] encrypted = cipher.doFinal(plain_input.getBytes("UTF8"));
        
          //decryption
          cipher = Cipher.getInstance(""AES/EBC/PKCS5Padding");
          cipher.init(Cipher.DECRYPT_MODE, key);
          byte[] decrypted = cipher.doFinal(encrypted);
          String plain_output = new String(decrypted, "UTF8");
        

        【讨论】:

          猜你喜欢
          • 2019-02-02
          • 2015-11-11
          • 2017-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多