Joh*_*ber 7 java encryption coldfusion
***甜蜜 - 感谢Edward Smith为CF Technote表示ColdFusion的密钥是Base64编码的.请参阅generateKey()了解'fix'
我的任务是使用Java 1.4.2来匹配给定的ColdFusion代码示例的加密结果.
已知/给定值:
假设:
给定/工作的ColdFusion加密代码示例:
<cfset ThisSalt = "16byte-salt-here">
<cfset ThisAlgorithm = "AES/CBC/PKCS5Padding">
<cfset ThisKey = "a-24byte-key-string-here">
<cfset thisAdjustedNow = now()>
<cfset ThisDateTimeVar = DateFormat( thisAdjustedNow , "yyyymmdd" )>
<cfset ThisDateTimeVar = ThisDateTimeVar & TimeFormat( thisAdjustedNow , "HHmmss" )>
<cfset ThisTAID = ThisDateTimeVar & "|" & someOtherData>
<cfset ThisTAIDEnc = Encrypt( ThisTAID , ThisKey , ThisAlgorithm , "Hex" , ThisSalt)>
Run Code Online (Sandbox Code Playgroud)
我的Java 1.4.2加密/解密代码赃物:
package so.example;
import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.*;
public class SO_AES192 {
private static final String _AES = "AES";
private static final String _AES_CBC_PKCS5Padding = "AES/CBC/PKCS5Padding";
private static final String KEY_VALUE = "a-24byte-key-string-here";
private static final String SALT_VALUE = "16byte-salt-here";
private static final int ITERATIONS = 1;
private static IvParameterSpec ivParameterSpec;
public static String encryptHex(String value) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(_AES_CBC_PKCS5Padding);
ivParameterSpec = new IvParameterSpec(SALT_VALUE.getBytes());
c.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
String valueToEncrypt = null;
String eValue = value;
for (int i = 0; i < ITERATIONS; i++) {
// valueToEncrypt = SALT_VALUE + eValue; // pre-pend salt - Length > sample length
valueToEncrypt = eValue; // don't pre-pend salt Length = sample length
byte[] encValue = c.doFinal(valueToEncrypt.getBytes());
eValue = Hex.encodeHexString(encValue);
}
return eValue;
}
public static String decryptHex(String value) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(_AES_CBC_PKCS5Padding);
ivParameterSpec = new IvParameterSpec(SALT_VALUE.getBytes());
c.init(Cipher.DECRYPT_MODE, key, ivParameterSpec);
String dValue = null;
char[] valueToDecrypt = value.toCharArray();
for (int i = 0; i < ITERATIONS; i++) {
byte[] decordedValue = Hex.decodeHex(valueToDecrypt);
byte[] decValue = c.doFinal(decordedValue);
// dValue = new String(decValue).substring(SALT_VALUE.length()); // when salt is pre-pended
dValue = new String(decValue); // when salt is not pre-pended
valueToDecrypt = dValue.toCharArray();
}
return dValue;
}
private static Key generateKey() throws Exception {
// Key key = new SecretKeySpec(KEY_VALUE.getBytes(), _AES); // this was wrong
Key key = new SecretKeySpec(new BASE64Decoder().decodeBuffer(keyValueString), _AES); // had to un-Base64 the 'known' 24-byte key.
return key;
}
}
Run Code Online (Sandbox Code Playgroud)
我无法创建匹配的加密值,也无法解密给定的加密值.我的猜测是它与我如何处理初始矢量/盐有关.
我不是很精通加密,但我认为我应该能够采用明文样本并在Java中生成与ColdFusion相同的加密值.我能够使用我的Java代码加密/解密我自己的数据(所以我是一致的)但我无法匹配或解密ColdFusion样本加密值.
我可以访问可以测试加密输出的本地Web服务.给定的ColdFusion输出样本通过/解密(当然).如果我尝试用我的Java代码解密相同的样本(使用实际的密钥和盐),我得到一个"给定最终块未正确填充"错误.当我将加密尝试(使用实际密钥和盐)传递给测试Web服务时,我得到了相同的净结果.
有任何想法吗?
Coldfusion ThisKey 中的值是:
<cfset ThisKey = "a-24byte-key-string-here">
Run Code Online (Sandbox Code Playgroud)
从 javagenerateKey() 函数返回的字符串完全相同?我相信它们必须是相同的字符串才能生成相同的加密文本。
要在 CF 中使用固定密钥,您可能需要遵循有关强加密的CF 技术说明:
您可能出于两个原因想要生成自己的密钥:
- 您想要匹配其他加密软件的详细信息。
- 您希望通过面向模式的密码分析技术来提高加密数据的破解能力。
例如,要创建一个 32 字节密钥以与具有十六进制值的 AES 算法一起使用:
8738fed68e7677d374e0946c8f7bd3bb4f50f23717f9f3667b2419483959039c
您将使用 ColdFusion 函数 BinaryDecode 和 ToBase64 来创建密钥:
<cfset myKey =
ToBase64(BinaryDecode("8738fed68e7677d374e0946c8f7bd3bb4f50f23717f9f3667b2419483959039c","Hex")>
<cfset encrypted =Encrypt(myString, myKey, "AES")>
Run Code Online (Sandbox Code Playgroud)
编辑:刚刚意识到密钥(正如您在评论中提到的)是base64,所以如果Java中的“generateKey”方法如下所示:
private static Key generateKey() throws Exception {
final byte[] decodedKey = new BASE64Decoder().decodeBuffer(KEY_VALUE);
final Key key = new SecretKeySpec(decodedKey, _AES);
return key;
}
Run Code Online (Sandbox Code Playgroud)
你应该是金色的。
归档时间: |
|
查看次数: |
2364 次 |
最近记录: |