微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PHP加密和使用Coldfusion解密

如何解决使用PHP加密和使用Coldfusion解密

我们目前正在使用PHP对网站中的值进行加密,然后再将其写入MysqL表。我们可以使用PHP成功解密这些值,但是,我们还需要能够使用Coldfusion解密数据。不幸的是,我们无法使它正常工作。我正在寻找一种可以完成以下两项操作的解决方案:

  1. 成功使用我们现有的用PHP编写的加密代码/数据,并能够通过Coldfusion(首选)成功解密。
  2. 对我们现有的用PHP编写的加密代码修改,可以在Coldfusion中成功解密。

这是我们当前的PHP加密代码

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;
  }

这是我们当前的PHP解密代码

                // 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 举报,一经查实,本站将立刻删除。