gpt4 book ai didi

Java 密码和 php mcrypt_encrypt(带 ECB 填充的 BLOWFISH 算法)

转载 作者:行者123 更新时间:2023-11-29 09:10:45 25 4
gpt4 key购买 nike

这是我的问题,我有从 java(jsp) 接口(interface)创建的用户帐户,该接口(interface)使用 Blowfish/ECB/PKCS5Padding 加密密码以存储在数据库中。现在,我正在尝试从另一个用 PHP 开发的应用程序使用从 java(jsp) 前端创建的用户帐户进行身份验证,但是当我尝试比较加密后从 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 中不能直接打印出字节数组。

关于Java 密码和 php mcrypt_encrypt(带 ECB 填充的 BLOWFISH 算法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12591391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com