首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串的三重DES加密为8字节十六进制

字符串的三重DES加密为8字节十六进制
EN

Stack Overflow用户
提问于 2017-09-27 06:17:48
回答 1查看 721关注 0票数 1

我必须使用TDES将字符串加密为8字节十六进制。以下是值(修改以供参考)

代码语言:javascript
复制
key = 636948778095358323114731
pin=1234

加密代码:

代码语言:javascript
复制
function encryptText_3des($plainText, $key) {
  $key = hash("md5", $key, TRUE); 
  for ($x=0;$x<8;$x++) {
      $key = $key.substr($key, $x, 1);
  }
  $padded = pkcs5_pad($plainText,mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
  $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
  return $encrypted;
}

function pkcs5_pad ($text, $blocksize) {
  $pad = $blocksize - (strlen($text) % $blocksize);
  return $text . str_repeat(chr($pad), $pad);
}

然而,当我这样做时:

代码语言:javascript
复制
//outputs 3des encrypted data
echo encryptText_3des($data, $encryption_key);

我知道这个错误:

代码语言:javascript
复制
   Warning: mcrypt_encrypt(): Encryption mode requires an initialization 
vector of size 8 

如何获得值?..(请将其作为8字节十六进制.)谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-27 07:09:08

您错过了加密函数的初始化向量:

代码语言:javascript
复制
function encryptText_3des($plainText, $key)
{
    $key = hash("md5", $key, TRUE);
    for ($x = 0; $x < 8; $x++) {
        $key = $key . substr($key, $x, 1);
    }
    $padded = pkcs5_pad($plainText,mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));

    // CBC initialization vector
    $iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv));

    return $encrypted;
}

另外,不要忘记将$iv字符串保存在某个地方(例如,包含在加密字符串中),因为后面的TDES解密过程需要IV字节。

另请参阅

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46440718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档