Blowfish加密,分别使用PHP和C++实现,但结果不同.该如何处理

WBOY
Freigeben: 2016-06-13 12:55:55
Original
725 Leute haben es durchsucht

Blowfish加密,分别使用PHP和C++实现,但结果不同...
先是MD5实验,结果相同,但使用Blowfish实验,怎么做也成功不了
调用如下:

<?php<br />
     <br />
    $cipher = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_ECB, '');<br />
<br />
    $iv   = '00000000';<br />
    $key  = "strkey11";<br />
<br />
    $stext = '38A0E9312DDA8F7C16B9A12159168C76';<br />
    $stext = md5($stext, true);<br />
    //经过调试知道,在这时$stext的值与C++中MD5后的结果一致<br />
<br />
    if (mcrypt_generic_init($cipher, $key, $iv) != -1)<br />
    {<br />
        $dtext = mcrypt_generic($cipher,$stext );<br />
        mcrypt_generic_deinit($cipher);<br />
<br />
        // Display the result in hex.<br />
        printf("blowfish encrypted:<br>%s<br><br>",strtoupper(bin2hex($dtext)));<br />
    }<br />
    mcrypt_module_close($cipher);<br />
Nach dem Login kopieren

C++的是这样:
    MD5_CTX md5;<br />
    unsigned char str[16];<br />
    md5.MD5String(strSource.c_str() ,str);<br />
<br />
    BlockCipher *bf;<br />
    char key[] = "strkey11";              //Key<br />
    bf = new BlowFish();<br />
    bf->setKey((void *)key, 8*8);<br />
<br />
    bf->encrypt((void *)str, 8);      //unsigned char str[16];<br />
    bf->encrypt((void *)(str+8), 8);<br />
    char temp1[4] = {0};<br />
    char buff1[128] = {0};<br />
    for(int i = 0;i<16;i++)<br />
    {<br />
        sprintf(temp1,"%02x",str[i]);<br />
        strcat(buff1,temp1);<br />
    }<br />
    AnsiString strResult = String(buff1).UpperCase();<br />
    delete bf;
Nach dem Login kopieren

------解决方案--------------------
$iv   = '00000000'; ???
按 bf->setKey((void *)key, 8*8); 理解
应该是
$iv = "\x00\x00\x00\x00\x00\x00\x00\x00";
吧?

------解决方案--------------------
IV is ignored in ECB. IV MUST exist in CFB, CBC, STREAM, nOFB and OFB modes.
MCRYPT_MODE_ECB的模式,$iv是忽略的,应该不是这个问题。

好像是加密之前要padding,你试试看
$size = mcrypt_get_block_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
$input = pkcs5_pad($input, $size); 

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

function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text)) return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!