这是我正在做的事情,可能看起来有些笨拙,但是可以帮助您解决该问题。我得到一个BadPaddingException
。阅读几乎所有相关主题,但找不到合适的解决方案。我是加密解密程序设计的新手,需要在我的Java应用程序之一中实现它。
谢谢..这就是代码的样子....
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// TODO Auto-generated method stub
String FileName="encryptedtext.txt";
String FileName2="decryptedtext.txt";
String pad="0";
KeyGenerator KeyGen=KeyGenerator.getInstance("AES");
KeyGen.init(128);
SecretKey SecKey=KeyGen.generateKey();
Cipher AesCipher=Cipher.getInstance("AES");
AesCipher.init(Cipher.ENCRYPT_MODE,SecKey);
byte[] byteText="My name is yogesh".getBytes();
byte[] byteCipherText=AesCipher.doFinal(byteText);
String cipherText = null;
try {
FileWriter fw=new FileWriter(FileName);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(byteCipherText.toString());
bw.close();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileReader fr=new FileReader(FileName);
BufferedReader br=new BufferedReader(fr);
cipherText=br.readLine();
br.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AesCipher.init(Cipher.DECRYPT_MODE,SecKey);
while(((cipherText.getBytes().length)%16)!=0)
{
cipherText=cipherText+pad;
}
byte[] bytePlainText=AesCipher.doFinal(cipherText.getBytes());
FileWriter fw1;
try {
fw1 = new FileWriter(FileName2);
BufferedWriter bw1=new BufferedWriter(fw1);
bw1.write(bytePlainText.toString());
bw1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在这里,您需要了解的是密文可能包含不可打印的字符。因此,当您使用readLine()时,它可能不会为您提供文件中的所有字节。
同样,byteCipherText.toString()
它并没有给您您认为会得到的。在Java中,该toString()
方法不提供数组内容的字符串表示形式。
无需在加密的文本中添加填充。它已经被填充。
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.crypto.*;
public class Main {
public static void main(String[] args) throws Exception {
String fileName = "encryptedtext.txt";
String fileName2 = "decryptedtext.txt";
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secKey = keyGen.generateKey();
Cipher aesCipher = Cipher.getInstance("AES");
byte[] byteText = "Your Plain Text Here".getBytes();
aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
byte[] byteCipherText = aesCipher.doFinal(byteText);
Files.write(Paths.get(fileName), byteCipherText);
byte[] cipherText = Files.readAllBytes(Paths.get(fileName));
aesCipher.init(Cipher.DECRYPT_MODE, secKey);
byte[] bytePlainText = aesCipher.doFinal(cipherText);
Files.write(Paths.get(fileName2), bytePlainText);
}
}
问题内容: 我必须使用openssl命令行或C api加密xml文件。输出应为Base64。 一个Java程序将用于解密。该程序由客户提供,不能更改(他们正在将这些代码用于旧版应用程序)。正如您在下面的代码中看到的那样,客户提供了一个密码短语,因此将使用SecretKeySpec方法生成密钥。 Java代码: 我已经测试了几个命令,例如: 但是,使用Java无法成功解密给定的输出。为了进行测试,我
问题内容: 我只想确认我对AES如何工作的理解。 如果company#1正在加密数据,并将此数据发送到company#2进行解密,则假定其中一个使用C#,另一个使用Java。 只要双方都使用相同的共享密钥,双方是否应该在设置/配置方面达成共识,以确保数据正确地加密和解密? 问题答案: 两者都有很多共识: 共享密钥 多久了?(是否需要填充键盘?) 实际的密钥是从另一个密钥或密码派生而来的吗? 使用了
我正在尝试将我的应用程序从128位AES密钥升级为256位AES。然而,当我将第54行从128更改为256时,我会得到以下密钥大小错误。 java.security.无效密钥异常: 非法的密钥大小 我已正确安装了JCE文件,我的应用程序生成较长的密钥这一事实证明了这一点。 我在其他文章中看到过“AES / CBC / PKCS7Padding”加密方法,但这只会让我遇到这个例外:
问题内容: 有没有一个很好的示例,说明如何在Android上使用AES 加密和解密图像及其他文件? 问题答案: 并像这样调用它们: 这应该可行,我现在在项目中使用类似的代码。
以下是我的加密/解密方法: 所以现在当我尝试加密时,我得到了这个异常: 我已经尝试在encrypt和Decrpt中使用密码实例。它只用于加密而不用于解密。我认为需要填充,因为数据大小不是16字节的倍数。“data”字节长度打印为,因此尝试将字符附加到数据中,然后进行加密,但也不起作用。
问题内容: 我之所以写这个问题+答案,是因为我挣扎了很多(也许是因为缺乏经验),并迷失了使用node或python进行加密/解密的许多不同方式。 我以为我的案子将来可以帮助人们。 我需要做的是: 从表单获取数据,使用Crypto(node-js)对其进行加密 在Python中传递加密的数据,然后使用PyCrypto将其解密。 我选择使用AES加密。 这是我的开始方式(我不会尝试的所有事情): 我遵