所有人。我基本上是试图加密和解密一个字符串类型的密码。我得到的错误是javax . crypto . illegalblocksizeexception:使用填充密码解密时,输入长度必须是8的倍数。
我尝试用指定的填充做其他算法,例如AES/CBC/NoPadding。但得到不同的错误是Java . security . invalidkeyexception:无效的AES密钥长度:5个字节。
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Encrpyt {
public static void main(String[] args) throws Exception
{
// TODO code application logic here
String userName="jimmy";
String password="chen";
String encryptedPassword=encrypt(password,userName);
System.out.println("this is encrypted password:"+encryptedPassword+"");
String decrptedPassword=decrypt(encryptedPassword,userName);
System.out.println("this is decrpted password is :"+decrptedPassword);
}
public static String encrypt(String strClearText,String strKey) throws Exception{
String strData="";
try {
SecretKeySpec skeyspec=new SecretKeySpec(strKey.getBytes(),"Blowfish");
Cipher cipher=Cipher.getInstance("Blowfish");
cipher.init(Cipher.ENCRYPT_MODE, skeyspec);
byte[] encrypted=cipher.doFinal(strClearText.getBytes());
strData=new String(encrypted);
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e);
}
return strData;
}
public static String decrypt(String strEncrypted,String strKey) throws Exception{
String strData="";
try {
SecretKeySpec skeyspec=new SecretKeySpec(strKey.getBytes(),"Blowfish");
Cipher cipher=Cipher.getInstance("Blowfish");
cipher.init(Cipher.DECRYPT_MODE, skeyspec);
byte[] decrypted=cipher.doFinal(strEncrypted.getBytes());
strData=new String(decrypted);
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e);
}
return strData;
}
}
您需要按如下方式填充文本字节:(请参阅内置填充的注释。
public static final String BLOWFISH_CIPHER = "Blowfish/ECB/NOPADDING";
public static final String BLOWFISH_SECRET_KEY_SPEC = "Blowfish";
public static String toHexString(byte[] array) {
return DatatypeConverter.printHexBinary(array);
}
public static byte[] toByteArray(String s) {
return DatatypeConverter.parseHexBinary(s);
}
public static byte[] pad(byte[] bytes) {
int remainder = bytes.length % 8;
if(remainder == 0){
return bytes;
}
int padding = 8 - remainder;
int newLength = padding+bytes.length;
byte[] newBytes = new byte[newLength];
Arrays.fill(newBytes,(byte)0);
System.arraycopy(bytes,0,newBytes,padding,bytes.length);
return newBytes;
}
public static String encryptBF(String string, String key) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance(BLOWFISH_CIPHER);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), BLOWFISH_SECRET_KEY_SPEC);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return toHexString(cipher.doFinal(pad(string.getBytes())));
}
public static String decryptBF(String string, String key) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance(BLOWFISH_CIPHER);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), BLOWFISH_SECRET_KEY_SPEC);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
return new String(cipher.doFinal(toByteArray(string)));
}
虽然对于调试来说,当我试图解密(使用相同的代码)app1上的加密url时,它工作得很好。但不知道是什么原因导致了APP2的异常? 这是代码
我有一个安全课程的项目,但我有一个问题。 基本上,我试图加密然后解密一个密码,但我得到这个解密错误。 我这样做对吗。我在关注2012年的一篇文章。还安全吗? 我还尝试替换算法,但似乎没有任何效果: “AES”、“RSA/ECB/PKCS1Padding”、“PbeWithHMACSHA256andDesede”..以及更多
运行以下代码时,如何解决此错误? 产出:
我在java类中发现了一个解密错误: 我能做些什么来解决这个问题? 更新: 我忘了提到它工作了一次,当第二次我试图再次执行它时,它抛出了上面提到的错误。
TCP客户端代码: 对于相同的代码,当消息很小时,它会被正确解密。但是当消息很长时,我会得到illegalBlocksize异常。我尝试使用aes/cbc/pkcs5padding来填充消息,并且blocksize是16的倍数。但我还是得到了相同的错误或BadPaddingException。如果am指定PKCS5Padding作为填充技术,那么应该正确填充消息,而不应该给出此错误。为什么不起作用
在这里我添加密码和连接到他们的网站到我的数据库,我认为这工作很好。当我检查数据库时,我可以在数据库中看到加密密码: 从数据库中检索加密密码并尝试打印它们的方法: } }