3des加密 java php_java的3DES加密PHP7解密备忘录
前言:
有一个项目需要跟甲方做接口,甲方使用的是java的3DES加密解密方式。
甲方加密解密部分截图代码:
填写图片摘要(选填)
第一步:
将甲方的iv转成PHP可以使用的偏移量
填写图片摘要(选填)
第二步:
使用甲方提供的加密程序:输入key和需要加密的字符串
得到加密字符串和解密字符串,留着和PHP7加密解密做对比
填写图片摘要(选填)
第三步:
使用
https://www.tech1024.com/original/2993.html
写的PHP7版的加密解密类库
填写图片摘要(选填)
得到的结果一样。
代码:
class Des
{
public static
function encrypt($input, $key, $method = 'DES-ECB', $iv =
null)
{
$iv = $iv ? $iv :
self::createIv();
return
base64_encode(openssl_encrypt($input, $method, $key,
OPENSSL_RAW_DATA, $method == 'DES-ECB' ? '' : $iv));
}
public static
function decrypt($input, $key, $method = 'DES-ECB', $iv =
null)
{
$iv = $iv ? $iv :
self::createIv();
return
openssl_decrypt(base64_decode($input), $method, $key,
OPENSSL_RAW_DATA, $method == 'DES-ECB' ? '' : $iv);
}
public static
function createIv()
{
return
self::hexToStr("0000000000000000");
}
public static
function hexToStr($hex)
{
$string = '';
for ($i = 0; $i <
strlen($hex) - 1; $i += 2) {
$string .= chr(hexdec($hex[$i] . $hex[$i +
1]));
}
return $string;
}
}
$str = 'helloworld';
$key = '123456781234567812345678';
$iv = pack('H*','1234567890abcdef');
echo
Des::encrypt($str,$key,'DES-EDE3-CBC',$iv);
echo PHP_EOL;
$str = 'wR/xa+1PN1E8vkWeDr//Dw==';
echo
Des::decrypt($str,$key,'DES-EDE3-CBC',$iv);
其他:
php7以下的装mcrypt扩展,也是可以实现的,网上找的DES类库,代码将贴在下面
填写图片摘要(选填)
得到的结果也一样
代码:
class Des
{
private
static $_instance = NULL;
var
$key;//秘钥向量
var
$iv;//混淆向量 ->偏移量
function
__construct()
{
$this->key =
'123456781234567812345678';
//$this->iv =
pack('H*','185286120-112-85-51-17');
//$this->iv =
'1234567890abcdef';
$this->iv =
pack('H*','1234567890abcdef');
}
public static
function share()
{
if
(is_null(self::$_instance)) {
self::$_instance = new Des();
}
return
self::$_instance;
}
function
encrypt($input)
{
//获得加密算法的分组大小 8
$size =
mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
//3DES加密将MCRYPT_DES改为MCRYPT_3DES
//ascii 填充
$input =
$this->pkcs5_pad($input, $size);
//如果采用PaddingPKCS7,请更换成PaddingPKCS7方法。
//用0填充秘钥为指定长度8
$key = str_pad($this->key,
8, '0'); //3DES加密将8改为24
//打开算法和模式对应的模块
$td =
mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');
//判断混淆向量是否为空
if ($this->iv == '')
{
//从算法源随机生成混淆向量
$iv =
@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),
MCRYPT_RAND);//类似b"¨ß^\f\x1EÅ╩5"
} else {
//反之取设置的混淆向量
$iv = $this->iv;
}
//初始化加密所需的缓冲区
@mcrypt_generic_init($td,
$key, $iv);
//加密数据 $td为算法对象模块 $input为处理过后的值
$data = mcrypt_generic($td,
$input);// 类似b"ýyP\x7FN\x00èiÝd>À?s\x18Î"
//对加密模块进行清理工作
mcrypt_generic_deinit($td);
//关闭加密模块
mcrypt_module_close($td);
//使用 MIME base64
对数据进行编码
$data =
base64_encode($data);//如需转换二进制可改成 bin2hex 转换
//如果设置了混淆向量
则加密的值是固定的 如果没设置混淆向量
则加密的值是随机的
return $data;
}
function
decrypt($encrypted)
{
//对使用 MIME base64
编码的数据进行解码
$encrypted =
base64_decode($encrypted); //如需转换二进制可改成 bin2hex 转换
//使用另一个字符串填充字符串为指定长度
获取秘钥
$key = str_pad($this->key,
8, '0'); //3DES加密将8改为24
//打开算法和模式对应的模块
$td =
mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC,
'');//3DES加密将MCRYPT_DES改为MCRYPT_3DES
//判断混淆向量是否为空
if ($this->iv == '')
{
//从算法源随机生成混淆向量
$iv =
@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),
MCRYPT_RAND);
} else {
//反之取设置的混淆向量
$iv = $this->iv;
}
//返回打开的模式所能支持的最长密钥 没用上
$ks =
mcrypt_enc_get_key_size($td);//DES 8 3DES 24
//初始化加密所需的缓冲区
@mcrypt_generic_init($td,
$key, $iv);
//解密数据 $td为算法对象模块 $encrypted为需要解密的数据
$decrypted =
mdecrypt_generic($td, $encrypted);//类似于
"15549070665\x05\x05\x05\x05\x05" 之前加密的数据
//对加密模块进行清理工作
mcrypt_generic_deinit($td);
//关闭加密模块
mcrypt_module_close($td);
//返回取出解密数据
$data =
$this->pkcs5_unpad($decrypted);
return $data;
}
function
pkcs5_pad($text, $blocksize)
{
//$pad=5 blocksize=11 $test=8 %取余
$pad = $blocksize -
(strlen($text) % $blocksize);//5
//返回ascii填补后的字符串, 类似
"15549070665\x05\x05\x05\x05\x05"
return $text .
str_repeat(chr($pad), $pad);
}
function
pkcs5_unpad($text)
{
//取出最后一个字符串
{15} ord返回字符的 ASCII
码值
$pad =
ord($text{strlen($text) - 1});//5
//判断$pad的值是否大于本身字符串
if ($pad > strlen($text))
{
//如果大于 则多余
return false;
}
//计算ASCII
码值中全部字符都存在于$text字符集合中的第一段子串的长度是否等于取出的$pad
if (strspn($text, chr($pad),
strlen($text) - $pad) != $pad) {
//如果不相等 则缺失
return false;
}
//返回字符串的子串
return substr($text, 0, -1 *
$pad);
}
function
PaddingPKCS7($data)
{
$block_size =
mcrypt_get_block_size(MCRYPTDES,
MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES
$padding_char = $block_size -
(strlen($data) % $block_size);
$data .=
str_repeat(chr($padding_char), $padding_char);
return $data;
}
private
function UnPaddingPKCS7($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);
}
}
echo (new
Des())->encrypt('helloworld');
echo PHP_EOL;
echo (new
Des())->decrypt('wR/xa+1PN1E8vkWeDr//Dw==');
3des加密 java php_java的3DES加密PHP7解密备忘录相关推荐
- php 3des 兼容java,PHP版3DES加解密类,可与java的3DES(DESede)加密方式兼容
/** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author: Luo Hui (farmer.luo at gmail.com) * ...
- php加密 java rsa_PHP的DES加密和RSA签名(兼容java)
主要用于php对接java的接口 rsa签名用SHA1WithRSA算法<?php /** * DES加密/解密,RSA加密/验签 * @author jiangwei * @version $ ...
- java之php、Android、JAVA、C# 3DES加密解密
异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...
- java中3des cbc,js與java通用的3DES(ECB,CBC)+Base64加密編碼,解碼解密
J S端加密過程: key的處理: 通過創建指定的key,key必須是16位/24位/32位其中一種,但是常用的3DES加密的key為24位,下面使用的就是24位,key的長度可以隨意指定,在轉換ke ...
- 3des加密 java php_php 3des加密 兼容JAVA 多么痛的领悟呀
最近和别人做接口用到SOCKET TCP/IP方式 其中需要对账号和密码进行3DES加密 对方提供了一个加密比对的软件和JAVA的实现代码 并且给了我们一个长度为32位的密钥 这边需要用PHP来实现! ...
- 3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例
java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...
- 安全架构-加密算法-3DES加密java实现
3DES加密java实现 3DES是三重数据加密,且可以逆推的一种算法方案.但由于3DES的算法是公开的,所以算法本身没有秘密,主要依靠唯一密钥来确保数据加解密的安全.到目前为止,仍没有人能破解3DE ...
- python 3des加密_DES/3DES之ECB模式和CBC模式加解密 及 Python 实现
概念说明 DES:Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法. 3DES:Triple DES,是三重数据加密算法(TDEA,Triple Data ...
- Java中的AES加密和解密(CBC模式)
通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...
最新文章
- 北电PBX资料_LD 11數位電話機設定
- XamarinForms教程构建XamarinForms开发环境
- balanced binary search tree
- [Python人工智能] 二十七.基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建
- 一步步创建ABAP post exit增强
- TypeError: Object of type ‘datetime‘ is not JSON serializable
- 模板语法-插入文本//模板语法-插入标签//模板语法-双花括号//模板语法-向标签属性中插入数据
- proteus数码管不亮是什么原因_数码管灌封胶有何产品性能特点?如何正确使用?...
- ubuntu无法安装usb驱动
- 内容超过7行显示查看全文
- websocket替代方案_码农手记 | 前后端实时交互方案概述
- mysql安装方法及使用
- word表格如何显示最后一行线
- 2021 MWC上海 | 5G消息引关注,菊风共谋5G建设发展新篇章
- 鸿蒙系统 微内核 sel4,微内核 seL4 Mapping
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
- 为Linux内核text段计算SHA1摘要以检测篡改
- Python将数字转换成大写字母
- bpython ipython 区别_python-IPython Noteb
- 【GAT】图注意力网络 - 简单的源码记录