如何解决使用PHP加密和使用Coldfusion解密
我们目前正在使用PHP对网站中的值进行加密,然后再将其写入MysqL表。我们可以使用PHP成功解密这些值,但是,我们还需要能够使用Coldfusion解密数据。不幸的是,我们无法使它正常工作。我正在寻找一种可以完成以下两项操作的解决方案:
private $cipher="AES-128-CBC";
// Encrypt a value
private function encrypt($value,$key){
$ivlen = openssl_cipher_iv_length($this->cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt($value,$this->cipher,$key,OPENSSL_RAW_DATA,$iv);
$hmac = hash_hmac('sha512',$ciphertext_raw,true);
$encryptedValue = base64_encode( $iv.$hmac.$ciphertext_raw );
return $encryptedValue;
}
// Decrypt a value
public function decrypt($encryptedValue,$key){
$val = base64_decode($encryptedValue);
$ivlen = openssl_cipher_iv_length($this->cipher);
$iv = substr($val,$ivlen);
$hmac = substr($val,$ivlen,$this->sha2len);
$ciphertext_raw = substr($val,$ivlen+$this->sha2len);
$decryptedValue = openssl_decrypt($ciphertext_raw,$iv);
return $decryptedValue;
}
我在Coldfusion中使用以下代码尝试了解密测试:
<cfset TestString="ltlXr0hdv8kE9v+VVJ8GmLYVfgPSZPr9QCL89QoMupFJrXNdYmFi7sp0wbx8CbzJycmzblLDB/zF5pXrmRasMoW8PGV7tfjnesxv8LUt7xj/56tAMHRJxIRk01TdpnvJ">
<cfset KeyString="7w!z%C&F)J@NcRfUjXn2r5u8x/A?D(G-KaPdSgVkYp3s6v9y$B&E)H@MbQeThWmZ">
<cfset NewString='#Decrypt(TestString,KeyString,"AES","Base64")#'>
<cfoutput>#NewString#</cfoutput>
“错误”,“ ajp-nio-8018-exec-7”,“ 09/25/20”,“ 11:26:48”,“”,“尝试加密或解密输入时发生错误string:”无法解码字符串““ 7w!z%C&F)J @ NcRfUjXn2r5u8x / A?D(G-KaPdSgVkYp3s6v9y $ B&E)H @ MbQeThWmZ”“。包含或处理的文件的特定顺序为:C:\ inetpub \ wwwroot \ scheduled \ Decrypt_Test.cfm,第3行:
请注意,正确的解密值是: Arlene
有什么想法吗?任何帮助,将不胜感激。谢谢。
解决方法
PHP代码使用AES-128,即。 e。一个16字节的大密钥。但是应用的密钥(7w!z%C&F)J@NcRfUjXn2r5u8x/A?D(G-KaPdSgVkYp3s6v9y$B&E)H@MbQeThWmZ
)大得多。 PHP根据指定的AES变体截断了太长的密钥,即对于AES-128,仅考虑前16个字节,其余部分被忽略。在ColdFusion脚本中,必须使用相同的16个字节的密钥。
此外,在PHP代码IV中,HMac和密文在Base64编码之前的加密过程中进行串联,并在Base64解码后的解密过程中再次分离。
解密需要IV和密文。 HMac通常用于身份验证,但此处未实现(为此,必须为接收的密文确定HMac,并将其与接收的HMac进行比较。)
在ColdFusion脚本中不会发生分离,而是直接解密连接的数据,这将失败。即必须实现丢失的分隔,然后才能使用IV和密文进行解密。
以下ColdFusion脚本说明了必须实现的逻辑。脚本可以执行here:
<!--- Hex encode encrypted data --->
<cfset EncryptedData=binaryDecode("ltlXr0hdv8kE9v+VVJ8GmLYVfgPSZPr9QCL89QoMupFJrXNdYmFi7sp0wbx8CbzJycmzblLDB/zF5pXrmRasMoW8PGV7tfjnEsxv8LUt7xj/56tAMHRJxIRk01TdpNvJ","base64")>
<cfset EncryptedDataHex=binaryEncode(EncryptedData,"hex")>
<!--- Separate IV (first 32 chars / 16 bytes),HMac(SHA512) (next 128 chars / 64 bytes),ciphertext --->
<cfset IVHex=Mid(EncryptedDataHex,1,32)>
<cfoutput>#IVHex#</cfoutput><br>
<cfset HMacHex=Mid(EncryptedDataHex,1+32,128)> <!--- Will not be used any further,see PHP code --->
<cfoutput>#HMacHex#</cfoutput><br>
<cfset CiphertextHex=Mid(EncryptedDataHex,1+32+128,len(EncryptedDataHex)-160)>
<cfoutput>#CiphertextHex#</cfoutput><br>
<!--- Truncate key to 16 bytes --->
<cfset Key=Mid("7w!z%C&F)J@NcRfUjXn2r5u8x/A?D(G-KaPdSgVkYp3s6v9y$B&E)H@MbQeThWmZ",16)>
<!--- Decrypt --->
<cfset KeyB64=toBase64(Key)>
<cfset IV=binaryDecode(IVHex,"hex")>
<cfset Plaintext=Decrypt(CiphertextHex,KeyB64,"AES/CBC/PKCS5Padding","hex",IV)>
<cfoutput>#Plaintext#</cfoutput>
输出:
96D957AF485DBFC904F6FF95549F0698
B6157E03D264FAFD4022FCF50A0CBA9149AD735D626162EECA74C1BC7C09BCC9C9C9B36E52C307FCC5E695EB9916AC3285BC3C657BB5F8E712CC6FF0B52DEF18
FFE7AB40307449C48464D354DDA4DBC9
Arlene
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。