coldfusion php,PHP加密代码转换为ColdFusion

我有一些PHP,我想在ColdFusion中做相同的操作.

function & _encryptMessage( $message ) {

$td = mcrypt_module_open( MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');

mcrypt_generic_init( $td, $this->key, $this->iv );

$encrypted_data = mcrypt_generic( $td, $message );

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

return base64_encode( $encrypted_data );

}

我认为这只是

encrypt(message,"","AES","Base64")

但是我没有真正的确定方式,而且感觉不对,所以我想知道是否有人能够指出我正确的方向.

所以MCRYPT_RIJNDAEL_256实际上意味着block size not the encryption strength.加密强度仍然是256,因为使用在sha-256处散列的值在PHP中生成密钥和salt.

这是我现在的加密调用:

加密(arguments.messageXML,instance.key, “AES / CBC / PKCS5Padding”, “Base64的”,ivSalt)

不幸的是,由于ivSalt的长度为32字节(256位),而AES只需要16字节的iv盐,因此会爆炸.看看here,看起来ColdFusion / Java中AES的最大块大小是16字节(128位).我似乎无法看到如何获得256位块大小.任何帮助将不胜感激.

解决方法:

正如Leigh建议我必须使用Bouncy Castle,轻量级API和Rijndael密码引擎.

我最终创建了一个函数来创建一个rijndael密码,并使用密钥和ivsalt加密和解密字符串.

// Create a block cipher for Rijndael

var cryptEngine = createObject("java", "org.bouncycastle.crypto.engines.RijndaelEngine").init(arguments.blocksize);

// Create a Block Cipher in CBC mode

var blockCipher = createObject("java", "org.bouncycastle.crypto.modes.CBCBlockCipher").init(cryptEngine);

// Create Padding - Zero Byte Padding is apparently PHP compatible.

var zbPadding = CreateObject('java', 'org.bouncycastle.crypto.paddings.ZeroBytePadding').init();

// Create a JCE Cipher from the Block Cipher

var cipher = createObject("java", "org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher").init(blockCipher,zbPadding);

// Create the key params for the cipher

var binkey = binarydecode(arguments.key,"hex");

var keyParams = createObject("java", "org.bouncycastle.crypto.params.KeyParameter").init(BinKey);

var binIVSalt = Binarydecode(ivSalt,"hex");

var ivParams = createObject("java", "org.bouncycastle.crypto.params.ParametersWithIV").init(keyParams, binIVSalt);

cipher.init(javaCast("boolean",arguments.bEncrypt),ivParams);

return cipher;

var cipher = createRijndaelBlockCipher(key=arguments.key,ivSalt=arguments.ivSalt);

var byteMessage = arguments.message.getBytes();

var outArray = getByteArray(cipher.getOutputSize(arrayLen(byteMessage)));

var bufferLength = cipher.processBytes(byteMessage, 0, arrayLen(byteMessage), outArray, 0);

var cipherText = cipher.doFinal(outArray,bufferLength);

return toBase64(outArray);

var cipher = createRijndaelBlockCipher(key=arguments.key,ivSalt=arguments.ivSalt,bEncrypt=false);

var byteMessage = toBinary(arguments.message);

var outArray = getByteArray(cipher.getOutputSize(arrayLen(byteMessage)));

var bufferLength = cipher.processBytes(byteMessage, 0, arrayLen(byteMessage), outArray, 0);

var originalText = cipher.doFinal(outArray,bufferLength);

return createObject("java", "java.lang.String").init(outArray);

function getByteArray(someLength)

{

byteClass = createObject("java", "java.lang.Byte").TYPE;

return createObject("java","java.lang.reflect.Array").newInstance(byteClass, someLength);

}

doEncrypt和doDecrypt函数是公开可见的,但不是创建rijndael密码的函数.加密和解密函数分别使用字符串,密钥和ivSalt返回加密或解密的字符串.

createRijndaelBlockCipher接受一个密钥,ivSalt,一个布尔值来说明密码是否将用于加密或解密以及块大小,尽管块大小默认为256位.这个功能得到了很好的评论,所以它应该有意义.

底部的UDF(特别感谢Jason Delmore的那个块)确保ColdFusion正确地为解密创建一个字节数组.创建字节数组的其他一些方法不起作用或最终在解密或抛出缓冲区错误中导致不一致的结果.

这是真的.当标准AES加密使用128位块和128位密钥用于分类为SECRET,192位或更高的TOP-SECRET时,需要花费太多精力. 256位块和256位键仅略高于顶部.只是因为你不能意味着你应该这样做.

请记住,MCRYPT_RIJNDAEL_256是块大小而不是加密级别.加密级别由传递给mcrypt_encrypt的密钥强度设置,增加块大小不会增加加密强度.

标签:rijndael,php,encryption,aes,coldfusion

来源: https://codeday.me/bug/20191007/1865641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值