2

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");」の行でエラーが発生します。

4

3 に答える 3

3

AES は対称アルゴリズムであるため、これらの使用はKeyPairGeneratorサポートされていません。あなたが呼び出すAESでキーを生成するにはKeyGenerator

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

コードの残りの部分を見ると、(etc を呼び出すため) 非対称暗号化を実現しようとしているように見えるgetPublic() and getPrivate()ので、RSA または Java がサポートする他の非対称アルゴリズムの使用に切り替えることをお勧めします。ほとんどの場合、呼び出しで置き換えるだけでよくAES、おそらく微調整が必​​要です。幸運をRSAgetInstance();

于 2012-05-29T13:13:32.760 に答える
1

私の知る限り、対称AES暗号化アルゴリズムです。つまり、暗号化/復号化に必要なキーは 1 つだけです。

JavaDoc からof java.security.KeyPairGenerator:

KeyPairGenerator クラスは、公開鍵と秘密鍵のペアを生成するために使用されます。

非対称暗号化アルゴリズムに使用する必要があることを意味します。対称暗号化アルゴリズムの場合は、javax.crypto.KeyGenerator.

ただし、このような AES を使用して Java でバイト配列を暗号化/復号化する方法に関するチュートリアルを単に模倣することをお勧めします。

クラスを使用しsun.misc.Base64Encoder / Base64Decoderて、バイト配列を文字列に/からエンコード/デコードしますが、この手順はスキップできます。

お役に立てれば

于 2012-05-29T12:42:45.347 に答える
0

AES のキーペア ジェネレーターをどのように使用できますか? AES は対称鍵アルゴリズムです。このリンクを参照してください。つまり、キー「k」を使用してデータを暗号化すると、同じキー「k」を使用してデータを復号化する必要があります。

しかし、鍵ペアを生成すると、その名のとおり 2 つの鍵が生成され、一方の鍵を使用して暗号化すると、もう一方の鍵を使用してのみ復号化できます。これはPKIのベースです。

キーペアジェネレーターを使用する場合は、次のようなアルゴリズムを使用する"rsa""dsa"、次のgetInstance()ようなメソッドを使用します。

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

上記の変更を行った後、コードは正常に動作するはずです。

于 2012-05-29T16:13:22.630 に答える