求大神给个DES算法的PHP版,谢谢!

mykelly6 2020-06-01 04:11:55
最近要写个接口,接口文档只有c#和java的加密方法,我这边开发环境是PHP的,百度了好多PHP版的算法,加密的提交过去都不对。。
public static string DESEnCode(string pToEncrypt,string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);


des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);

cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();

StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}

public static String DESEncrypt(String key,String message){
String encrypt = "";
try {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] b = cipher.doFinal(message.getBytes("UTF-8"));
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < b.length; i++) {
String plainText = Integer.toHexString(0xff & b[i]);
if (plainText.length() < 2)
plainText = "0" + plainText;
hexString.append(plainText);
}
encrypt = hexString.toString();
encrypt = encrypt.toUpperCase();
} catch (Exception e) {
e.printStackTrace();
}
return encrypt;
}
...全文
181 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mykelly6 2020-06-02
  • 打赏
  • 举报
回复
解决了,用openssl的方法加密,可以兼容。
	//DES加密算法,兼容C#/JAVA
	private function encryPwd($encryString, $encryKey)
    {
        $keyLen   = strlen($encryKey);
        if (null == $encryKey || $keyLen < 8) {
            $encryKey = str_pad($encryKey, 8, '0', STR_PAD_RIGHT);
        }
        if ($keyLen > 8) {
            $encryKey = substr($encryKey, 0, 8);
        }
        $key     = mb_convert_encoding($encryKey, 'UTF-8');
        $message = mb_convert_encoding($encryString, 'UTF-8');
        $encry   = openssl_encrypt($message, 'DES-CBC', $key, OPENSSL_RAW_DATA, $key);

        return bin2hex($encry);
    }  
mykelly6 2020-06-01
  • 打赏
  • 举报
回复
百度到的算法是这样的,但是最后用16进制编码和base64编码都不行
    public function encryptDesEcbPKCS5($input, $key)
    {
        $size = mcrypt_get_block_size('des', 'ecb');
        $input = $this->pkcs5_pad($input, $size);
        $td = mcrypt_module_open('des', '', 'ecb', '');
        //获取密钥的最大长度
        $ks = mcrypt_enc_get_key_size($td);
        $key = substr($key, 0, $ks);
        //加密向量值
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        //$iv =0;
        $tmp = mcrypt_generic_init($td, $key, $iv);
        $data = mcrypt_generic ($td, $input);
		
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return strtoupper(bin2hex($data));
    }

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧