【问题标题】:AES KeyPairGenerator Not RecognisedAES KeyPairGenerator 无法识别
【发布时间】:2012-05-29 12:14:14
【问题描述】:

我的 java 代码有问题。我正在尝试加密文件。但是,当我运行我的 java 代码时,我得到“java.security.InvalidKeyException: Invalid AES key length: 162 bytes”。

代码如下:

byte[] rawFile;
File f = new File("./src/wonkybox.stl");
FileInputStream fileReader = new FileInputStream(f);
rawFile = new byte[(int)f.length()];
fileReader.read(rawFile);

/*****   Encrypt the file (CAN DO THIS ONCE!)  ***********/

//Generate the public/private keys
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("AES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG","SUN");
keyGen.initialize(1024, random);
KeyPair key = keyGen.generateKeyPair();
PrivateKey privKey = key.getPrivate();
PublicKey pubKey = key.getPublic();

//Store the keys
byte[] pkey = pubKey.getEncoded();
FileOutputStream keyfos = new FileOutputStream("./CloudStore/keys/pubkey");
keyfos.write(pkey);
keyfos.close();

pkey = privKey.getEncoded();
keyfos = new FileOutputStream("./CloudStore/keys/privkey");
keyfos.write(pkey);
keyfos.close();


//Read public/private keys
KeyFactory keyFactory = KeyFactory.getInstance("AES");
FileInputStream keyfis = new FileInputStream("./CloudStore/keys/pubkey");
byte[] encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
PublicKey pub1Key = keyFactory.generatePublic(pubKeySpec);

keyfis = new FileInputStream("./CloudStore/keys/privkey");
encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();

PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(encKey);
PrivateKey priv1key = keyFactory.generatePrivate(privKeySpec);

//Encrypt file using public key
Cipher cipher = Cipher.getInstance("AES");
System.out.println("provider= " + cipher.getProvider());
cipher.init(Cipher.ENCRYPT_MODE, pub1Key);


byte[] encryptedFile;
encryptedFile = cipher.doFinal(rawFile);

//Write encrypted file to 'CloudStore' folder
FileOutputStream fileEncryptOutput = new FileOutputStream(new File("./CloudStore/encrypted.txt"));
fileEncryptOutput.write(encryptedFile);
fileEncryptOutput.close();

错误发生在“KeyPairGenerator keyGen = KeyPairGenerator.getInstance("AES");”这一行。

【问题讨论】:

标签: java file encryption key aes


【解决方案1】:

AES 是一种对称算法,因此不支持使用 KeyPairGenerator。要使用 AES 生成密钥,请调用 KeyGenerator

KeyGenerator kgen = KeyGenerator.getInstance("AES");
       kgen.init(128);  //set keysize, can be 128, 192, and 256

通过查看您的其余代码,您似乎正在尝试实现非对称加密(因为您调用 getPublic() and getPrivate() 等),所以我建议您改用 RSA 或 java 支持的任何其他非对称算法。您很可能只需要在您的getInstance(); 调用中将AES 替换为RSA,并且可能还需要一些微调。祝你好运

【讨论】:

    【解决方案2】:

    据我所知,AES对称加密算法,即它只需要一个密钥来加密/解密。

    来自 JavaDoc of java.security.KeyPairGenerator

    KeyPairGenerator 类用于生成公钥和私钥对。

    意味着它应该用于非对称加密算法。对于对称加密算法,应该使用javax.crypto.KeyGenerator

    但是,我建议简单地模仿一些关于如何使用 this one 之类的 AES 在 Java 中加密/解密字节数组的教程。

    它使用sun.misc.Base64Encoder / Base64Decoder 类来编码/解码字节数组到/从字符串,但是你可以跳过这一步。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      如何为 AES 使用密钥对生成器? AES 是一种对称密钥算法。请参阅此 link。这意味着如果您使用密钥“k”加密数据,那么您也必须使用相同的密钥“k”对其进行解密。

      但是当您生成密钥对时,顾名思义,会生成两个密钥,如果您使用其中一个密钥加密,则只能使用另一个密钥解密。这是PKI 的基础。

      如果您想使用密钥对生成器,请在 getInstance() 方法中使用类似 "rsa""dsa" 的算法,如下所示:

      KeyPairGenerator keygen=KeyPairGenerator.getInstance("rsa");
      

      我认为您的代码在进行上述更改后现在应该可以正常工作了。

      【讨论】:

      • 谢谢!最初,我将 RSA 用于 KeyPairGenerator,但是我收到“数据不得超过 117 字节”错误,因此我切换到 AES。我将改用对称加密
      • @user1406126 :您必须使用 1024 位密钥。你的数据很大吗?如果不是很大且在 245 字节以内,则可以使用 2048 位密钥。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多