- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先我要说声谢谢...
我写了一个程序,用枚举来加密和解密。枚举有 AES、BlowFish、DESede。我的程序将支持这 3 种加密算法。
然后我想用SecretKeyFactory生成一个SecretKey。但是我想,我在生成 key 时犯了一个错误。 (显然我在代码中放松了自己。我不知道我能做什么...)
我的代码如下。 这个程序的目的是;
我知道我的代码真的很糟糕。它有很多不必要的声明和逻辑错误。
代码有时运行良好,有时会崩溃。
EDIT = 问题是我的代码并不总是有效。有时会报错。 错误为 = javax.crypto.BadPaddingException:给定的最终 block 未正确填充
感谢您的回答。
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class SymetricAlgorithms {
private static enum algorithms { //Enum declaration 3 encryption types here
AES, BlowFish, DESede;
}
private static String data = "HOWCANISOLVETHIS"; //this will be encrypt and decrypt
public static void main(String[] args) throws Throwable {
SecretKey kgen = GenerateKey(); // Create a key.
String encrypText = encrypt(kgen, data, algorithms.AES); //encrypt method calling here.
String decrypText = dencypt(kgen, encrypText, algorithms.AES);//decrypt method calling here.
System.out.println("plaintext = " + data + " key = " + kgen
+ "\nEncryptedText = " + encrypText
+ "\nDecryptedText = " + decrypText);
}
public static String dencypt(SecretKey inKey, String text, algorithms eValue)throws Throwable {//decryption
try {
byte[] text2 = text.getBytes(); //convert from parameters TEXT to Bytes
Cipher cipher = Cipher.getInstance("AES"); //Cipher initialize and choose encryption method (AES)
cipher.init(Cipher.DECRYPT_MODE, inKey); //cipher process
byte plainTextByte[] = new byte[20]; //Creating byte array
plainTextByte =cipher.doFinal(text2);//using byte array to assign ciphers result
System.out.println(plainTextByte);
return new String(plainTextByte);
} catch (Exception e) {
System.err.println("Data Cant Decrypted !");
e.printStackTrace();
}
return null;
}
public static String encrypt(SecretKey inKey, String text, algorithms eValue)
throws Throwable {
try {
Cipher cipher = null; //cipher declaration
switch (eValue) {//Enum. 3 types here and control structure for Users choosing encryption type is acceptable
case AES:cipher = Cipher.getInstance("AES");
break;
case BlowFish:Cipher cipher2 = Cipher.getInstance("BlowFish");
cipher = cipher2;
break;
case DESede:Cipher cipher3 = Cipher.getInstance("DESede");
cipher=cipher3;
break;
default:
System.out.println("Unexpectable value input.");
break;
}
System.out.println(inKey);
//Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, inKey);
byte[] ciphertext = cipher.doFinal(text.getBytes("UTF-8"));//cipher result is assign to byte array
System.out.println(ciphertext);
return new String(ciphertext);
} catch (Exception e) {
System.err.println("Unexpectable algorithm type !");
e.printStackTrace();
}
return null;
}
public static SecretKey GenerateKey() throws Throwable {//Generate a key for using crypt
//could sb explain these? =D I loose myself. I combined codes from finding internet...Failed...
try {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
byte bytes[] = new byte[20];
prng.nextBytes(bytes);
String passwordTemp = prng.toString();
String saltTemp = passwordTemp;
char[] password = passwordTemp.toCharArray();
byte[] salt = saltTemp.getBytes();
KeySpec spec = new PBEKeySpec(password, salt, 65536, 128);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
return secret;
} catch (Exception e) {
System.err.println("Key cant be generated !");
e.printStackTrace();
}
return null;
}
}
最佳答案
问题的主题是对字符串和字节之间关系的误解。在加密方法的最后,你认为这两行是做什么的:
byte[] ciphertext = cipher.doFinal(...
return new String(ciphertext);
最后一行采用加密的字节,几乎可以是任何东西,并且尝试将这些字节解释为对字符串的某些字符进行编码。使用什么编码?不带字符编码参数的字符串构造函数使用系统默认编码,这取决于 JVM/OS/Locale。假设它是 UTF-8。您是否保证加密字节实际上是某些字符?答:没有。当您获取结果字符串并调用 .getBytes("UTF-8") 时,您会得到相同的字节吗?答:不,有多个字节序列编码相同的字符,因此 new String(bytes, "UTF-8").getBytes("UTF-8") 不能保证返回您开始的字节。
总而言之,不要试图将任意字节解释为字符串。使您的加密方法返回 byte[],并且您的解密方法采用字节数组进行解码——然后它将起作用。
没有必要让你的程序运行,但如果你必须将加密的字节表示为字符串,请考虑 base64 编码或十六进制编码——这些编码唯一地将每个可能的字节(或字节序列)映射到一个字符串.
更新:这里有一个更简洁的 generateKey() 方法。它允许您将密码作为参数传递。
public static SecretKey generateKey(String password) {
try {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
byte saltBytes[] = new byte[20];
secureRandom.nextBytes(saltBytes);
KeySpec spec = new PBEKeySpec(password.toCharArray(), saltBytes, 65536, 128);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKey secretKey = factory.generateSecret(spec);
return new SecretKeySpec(secretKey.getEncoded(), "AES");
} catch (Exception e) {
throw new IllegalStateException("Key cant be generated !");
}
}
关于java - 加密 - 使用 AES/BlowFish/DESede 和 Enum 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17472684/
我正在开发一个项目,该项目使用 Java 服务来加密我从网络服务收到的签名。我需要用 JavaScript 替换这段代码。 这是我使用 JavaScript 的地方 http://jsfiddle.n
我在 Java 中使用 DESede 加密,我想在 C++ 中使用 OpenSSL 的 API 进行相同的加密。 Java代码: String secretKey = "abcdefghijk
我们有一个与java相关的应用程序,它以加密形式将密码存储在数据库中,因此我们需要解密并使用它进行身份验证,并再次加密密码并存储在数据库中以创建新用户。基本上我们使用加密/密码验证的解密标准。它最初是
我正在尝试在 iOS 上实现一种加密方式。以匹配在 JAVA 上运行的那个。 但我尝试的每件事都会导致不同的加密模式 这是我用于加密的 Java 代码: public static String
我在理解java和python的三重Des算法之间的概念时遇到问题。在 java 中,加密 key 的长度为 48 个字符,而在 python 中则不能应用相同的 key 。我尝试了提到的两个建议 h
我必须匹配的输出来自 Java DESede,使用 2005 年的 BouncyCaSTLe Jar ...我非常接近... 这是我在 Java 中的输出(这是正确的),后面是我在 C# 中的输出..
我尝试兼容 C# 和 Java 的加密/解密。 据我所知,默认模式在 Java 中是“ecb/pkcs5”,在 C# 中是“cbc/pkcs7”。 所以我匹配这些东西。 第一个问题是 PKCS7 和
我写了这段代码,我的 key 是:“ooWqEPcw7KR/h/JIbrFCRHiEVaybvnB2”。 try { Base64Decoder base64Decod
我正尝试在 Java 中使用 TripleDES 加密。来自Wikipedia article在 Keying Options 下,我想使用选项 1,其中 所有三个键都是独立的。 来自Cipher d
我正在尝试将 Java 的 DESede 解密转换为 PHP 的版本。然而,对于相同的输入,PHP 无法提供相同的输出。 Java: public class ThreeDES { priva
代码使用 DiffieHellman 和 DES 加密。DES 不安全,我想使用 DESede 或 AES。 SecretKeyFactory skf = SecretKeyFactory.getIn
首先我要说声谢谢... 我写了一个程序,用枚举来加密和解密。枚举有 AES、BlowFish、DESede。我的程序将支持这 3 种加密算法。 然后我想用SecretKeyFactory生成一个Sec
加密文本是用JAVA完成的(我们根本没有JAVA背景) 解密将用 C# 进行,代码如下 public static string DecryptString(string Message, strin
在我的 Android 应用程序中,我想使用 DESede/CBC/PKCS5Padding 加密密码,我的解决方案适用于 Lollipop(5.x)、Android KitKat(4.4.x) 和
我知道这个问题经常被问到,但我已经检查了我在 Stack Overflow 中找到的所有内容,但没有找到解决我的问题的方法。 我正在使用 DESede 进行加密和解密,并采用外部 24 字节 key
我想创建一个大小为 128 位的 TDES key ,因此我使用 keytool 通过以下命令生成 jceks。当我在 C:\Program Files (x86)\Java\jdk1.8.0_25\
我是一名优秀的程序员,十分优秀!