簡體   English   中英

Java密碼和php mcrypt_encrypt(帶有ECB填充的BLOWFISH算法)

[英]Java cipher and php mcrypt_encrypt (BLOWFISH algorithm with ECB padding)

這是我的問題,我有從java(jsp)接口創建的用戶帳戶,該接口使用Blowfish / ECB / PKCS5Padding加密密碼以存儲在數據庫中。 現在,我嘗試使用從Java(jsp)前端創建的用戶帳戶,通過PHP開發的另一個應用程序進行身份驗證,但是當我嘗試比較加密后從Java端和php返回的值時,它們出來是不同的。

JAVA代碼:

     import java.io.*;
     import java.util.*;
     import javax.crypto.*;
     import javax.crypto.spec.*;

     import java.security.Provider;
     import java.security.Security;
     public class Test
     {
       public static byte[] raw =null;
       public static SecretKeySpec skeySpec;
       public static Cipher cipher;
       public static void main(String ags[]) throws Exception
       {
           byte[] key={1,2,3,4,5,6,7};
           skeySpec = new SecretKeySpec(key, "Blowfish");
           System.out.println("KEY : "+bytesToString(skeySpec.getEncoded()));
                   String cipherInstName = "Blowfish/ECB/PKCS5Padding";
           cipher = Cipher.getInstance(cipherInstName);
           cipher.init(Cipher.ENCRYPT_MODE,skeySpec);
           byte[] encrypted = cipher.doFinal(("asdfgh").getBytes());        
           System.out.println("PLAIN TEXT : "+("asdfgh").getBytes());
           System.out.println("ENCRYPTED TEXT : "+bytesToString(encrypted));             
       }

           private static String bytesToString(byte [] value)
           {
                   StringBuffer retVal = new StringBuffer();
                   for(int i=0; i<value.length; i++)
                   {
                       retVal.append(value[i]+":");
                   }
                   int inx = retVal.toString().lastIndexOf(":");
                   retVal= new StringBuffer(retVal.toString().substring(0,inx));
                   return retVal.toString();
           }
     }

JAVA輸出:

    KEY : 1:2:3:4:5:6:7
    PLAIN TEXT : [B@1ea5671
    ENCRYPTED TEXT : 81:102:-114:102:82:80:83:-123

PHP代碼:

    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;
    return substr($text, 0, -1 * $pad);
}
$blockSize = mcrypt_get_block_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
$padded = pkcs5_pad("asdfgh",$blockSize);
$key="1:2:3:4:5:6:7";
echo "<br/>";
//$cipher = mcrypt_ecb(MCRYPT_BLOWFISH,$key, $padded, MCRYPT_ENCRYPT);
$cipher = mcrypt_encrypt("blowfish",$key,$padded,"ecb");
echo "ENCRYPTED TEXT : ".base64_encode($cipher);

PHP輸出:

    ENCRYPTED TEXT : draOlOiLFMs/Y+x+7mOhZw==

請幫助我解決此問題。

謝謝:)

首先,您可能希望在兩個系統上都以十六進制編碼您的字節,這使得比較容易得多。

其次,您無法控制如何在字符串之間轉換為字節數組編碼(反之亦然)。 這稱為字符編碼。 在Java中,切勿在未指定字符編碼的情況下使用String.getBytes()方法。

[B@1ea5671結果只是字節數組對象實例的標識。 您不能直接在Java中打印出字節數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM