php des加密用java解析不了 改个模式 加个IV php密钥/IV要求都是8位
php des加密用java解析不了 改个模式 加个IV php密钥/IV要求都是8位
php des加密用java解析不了 Wrong IV length: must be 8 bytes long
PHP的DES加密和Java解密不兼容的问题通常是因为PHP默认使用ECB模式,而Java可能默认使用其他模式如CBC,或者使用不同的padding方式。
解决方法:
确保PHP和Java使用相同的加密模式(如CBC)和padding方式(如PKCS5Padding或NoPadding)。
确保两边使用相同的密钥和初始化向量(IV)。
以下是PHP和Java分别使用CBC模式和PKCS5Padding的示例代码:
PHP:
<?php
$key = '12345678'; // 密钥
$iv = '12345678'; // 初始化向量
$data = 'Data to encrypt'; $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');
mcrypt_generic_init($td, $key, $iv); $encrypted = mcrypt_generic($td, $data);
mcrypt_generic_deinit($td);
mcrypt_module_close($td); echo base64_encode($encrypted);
?>
JAVA:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64; public class Main {
public static void main(String[] args) throws Exception {
String key = "12345678"; // 密钥
String iv = "12345678"; // 初始化向量
String data = "Data to encrypt"; Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] encrypted = cipher.doFinal(data.getBytes());
System.out.println(Base64.getEncoder().encodeToString(encrypted));
}
}
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64; public class Main {
public static void main(String[] args) throws Exception {
String key = "12345678"; // 密钥
String iv = "12345678"; // 初始化向量
String data = "Data to encrypt"; Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] encrypted = cipher.doFinal(data.getBytes());
System.out.println(Base64.getEncoder().encodeToString(encrypted));
}
}
在这两个示例中,我们都使用了CBC模式和PKCS5Padding,并且密钥和初始化向量都是固定的字符串。在实际应用中,你需要确保密钥和向量的安全性,并且在解密时使用相同的参数。
链接:des加密,url编码,url解码,des解密 DES加解密及Wrong key size错误处理
https://www.cnblogs.com/oktokeep/p/17917821.html
工具类DEMO:
package com.example.core.mydemo.des; import com.example.core.mydemo.MD5; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder; /**
* output:原始字符串 = {"phone":"1391111","username":"张三"}
* des加密 = LHFFScjfDE1kEyz27Y4ffRb0aM98qONoW8HGHzqjCqBqX9fwlPb28w==
* url编码 = LHFFScjfDE1kEyz27Y4ffRb0aM98qONoW8HGHzqjCqBqX9fwlPb28w%3D%3D
* url解码 = LHFFScjfDE1kEyz27Y4ffRb0aM98qONoW8HGHzqjCqBqX9fwlPb28w==
* 不相同
* des解密 = {"phone":"1391111","username":"张三"}
*/
public class CbcIvDesUtls {
private static String CHARSETNAME="UTF-8"; static String iv = "12345678"; // 初始化向量 /**
* DES加解密及Wrong key size错误处理
* @param key
* @return
* @throws UnsupportedEncodingException
*/
private static byte[] getKeyBytes(String key) throws UnsupportedEncodingException {
byte[] keyBytes = key.getBytes(CHARSETNAME);
if (keyBytes.length < 8) {
byte[] bytes = new byte[8];
System.arraycopy(keyBytes, 0, bytes, 0, keyBytes.length);
keyBytes = bytes;
}
return keyBytes;
} public static String getDESStr(String str, String encryptKey, String type, String charset) throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(encryptKey.getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
//加密
if ("ENCRYPT".equals(type)) {
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
return Base64Encoder.encode(cipher.doFinal(str.getBytes(charset)));
}else if ("DECRYPT".equals(type)) {
byte[] encodeByte = Base64Encoder.decode(str.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decoder = cipher.doFinal(encodeByte);
return new String(decoder, charset);
}
return "type error";
} public static void main(String[] args) {
//java.security.InvalidKeyException: Wrong key size
//密钥要求是8位
String encryptKey = "abcdefgh"; String type = "ENCRYPT";
String charset = "UTF-8"; String str = "{\"phone\":\"1391111\",\"username\":\"张三\"}"; System.out.println("原始字符串 = " + str);
try {
//des加密
String DESStr= getDESStr(str,encryptKey,type,charset);
System.out.println("des加密 = " + DESStr);
// url编码
DESStr = URLEncoder.encode(DESStr,"UTF-8");
System.out.println("url编码 = " + DESStr); //url解码
String s = URLDecoder.decode(DESStr,"UTF-8");
System.out.println("url解码 = " + s); //javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
/**
* 报错原因是因为:解密字符串不是url解码后的,所以会报该错误。
*/
// System.out.println("des解密2 = " + getDESStr(DESStr,encryptKey,"DECRYPT","UTF-8")); //des解密
if(DESStr.equals(s)){
System.out.println("相同");
}else{
System.out.println("不相同");
}
System.out.println("des解密 = " + getDESStr(s,encryptKey,"DECRYPT","UTF-8")); //ENCRYPT(des加密) encode(url编码) >> decode(url解码) encrypt(des解密) } catch (Exception e) {
e.printStackTrace();
}
} }
package com.example.core.mydemo.des; import com.example.core.mydemo.MD5; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder; /**
* output:原始字符串 = {"phone":"1391111","username":"张三"}
* des加密 = LHFFScjfDE1kEyz27Y4ffRb0aM98qONoW8HGHzqjCqBqX9fwlPb28w==
* url编码 = LHFFScjfDE1kEyz27Y4ffRb0aM98qONoW8HGHzqjCqBqX9fwlPb28w%3D%3D
* url解码 = LHFFScjfDE1kEyz27Y4ffRb0aM98qONoW8HGHzqjCqBqX9fwlPb28w==
* 不相同
* des解密 = {"phone":"1391111","username":"张三"}
*/
public class CbcIvDesUtls {
private static String CHARSETNAME="UTF-8"; static String iv = "12345678"; // 初始化向量 /**
* DES加解密及Wrong key size错误处理
* @param key
* @return
* @throws UnsupportedEncodingException
*/
private static byte[] getKeyBytes(String key) throws UnsupportedEncodingException {
byte[] keyBytes = key.getBytes(CHARSETNAME);
if (keyBytes.length < 8) {
byte[] bytes = new byte[8];
System.arraycopy(keyBytes, 0, bytes, 0, keyBytes.length);
keyBytes = bytes;
}
return keyBytes;
} public static String getDESStr(String str, String encryptKey, String type, String charset) throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(encryptKey.getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
//加密
if ("ENCRYPT".equals(type)) {
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
return Base64Encoder.encode(cipher.doFinal(str.getBytes(charset)));
}else if ("DECRYPT".equals(type)) {
byte[] encodeByte = Base64Encoder.decode(str.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decoder = cipher.doFinal(encodeByte);
return new String(decoder, charset);
}
return "type error";
} public static void main(String[] args) {
//java.security.InvalidKeyException: Wrong key size
//密钥要求是8位
String encryptKey = "abcdefgh"; String type = "ENCRYPT";
String charset = "UTF-8"; String str = "{\"phone\":\"1391111\",\"username\":\"张三\"}"; System.out.println("原始字符串 = " + str);
try {
//des加密
String DESStr= getDESStr(str,encryptKey,type,charset);
System.out.println("des加密 = " + DESStr);
// url编码
DESStr = URLEncoder.encode(DESStr,"UTF-8");
System.out.println("url编码 = " + DESStr); //url解码
String s = URLDecoder.decode(DESStr,"UTF-8");
System.out.println("url解码 = " + s); //javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
/**
* 报错原因是因为:解密字符串不是url解码后的,所以会报该错误。
*/
// System.out.println("des解密2 = " + getDESStr(DESStr,encryptKey,"DECRYPT","UTF-8")); //des解密
if(DESStr.equals(s)){
System.out.println("相同");
}else{
System.out.println("不相同");
}
System.out.println("des解密 = " + getDESStr(s,encryptKey,"DECRYPT","UTF-8")); //ENCRYPT(des加密) encode(url编码) >> decode(url解码) encrypt(des解密) } catch (Exception e) {
e.printStackTrace();
}
} }
工具类DEMO简化版本:
package com.example.core.mydemo.des; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64; public class IvDesTest {
public static void main(String[] args) throws Exception{
String key = "12345678"; // 密钥8位
String iv = "12345678"; // 初始化向量 Wrong IV length: must be 8 bytes long
String data = "Data to encrypt"; Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); //加密
byte[] encrypted = cipher.doFinal(data.getBytes());
String encryptStr = Base64.getEncoder().encodeToString(encrypted);
System.out.println("encryptStr=" + encryptStr); //解密
byte[] encodeByte = Base64Encoder.decode(encryptStr.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decoder = cipher.doFinal(encodeByte);
String decryptStr = new String(decoder);
System.out.println("decryptStr=" + decryptStr);
}
}
package com.example.core.mydemo.des; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64; public class IvDesTest {
public static void main(String[] args) throws Exception{
String key = "12345678"; // 密钥8位
String iv = "12345678"; // 初始化向量 Wrong IV length: must be 8 bytes long
String data = "Data to encrypt"; Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "DES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec); //加密
byte[] encrypted = cipher.doFinal(data.getBytes());
String encryptStr = Base64.getEncoder().encodeToString(encrypted);
System.out.println("encryptStr=" + encryptStr); //解密
byte[] encodeByte = Base64Encoder.decode(encryptStr.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] decoder = cipher.doFinal(encodeByte);
String decryptStr = new String(decoder);
System.out.println("decryptStr=" + decryptStr);
}
}
php des加密用java解析不了 改个模式 加个IV php密钥/IV要求都是8位的更多相关文章
- des加密解密——java加密,php解密
最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...
- des加密解密JAVA与.NET互通实例
JAVA版本 import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFacto ...
- DES加密解密 Java中运用
DES全称Data Encryption Standard,是一种使用密匙加密的块算法.现在认为是一种不安全的加密算法,因为现在已经有用穷举法攻破DES密码的报道了.尽管如此,该加密算法还是运用非常普 ...
- paip.提升安全性----Des加密 java php python的实现总结
paip.提升安全性----Des加密 java php python的实现总结 /////////// uapi private static String decryptBy ...
- Android和java平台 DES加密解密互通程序及其不能互通的原因
网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DES 加密和java DES加密的程序不能互通.就是加密的结果不一样 ...
- C#DES加密,JavaDES解密,另转C#和Java实现Des完整代码
C#DES加密,JavaDES解密,另转C#和Java实现Des完整代码 转载 2014年06月17日 17:36:09 标签: DES / C#DES / JavaDES / C#和Java交叉DE ...
- php实现和c#一致的DES加密解密
原文:php实现和c#一致的DES加密解密 php实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用.以下正确代码是我经过苦苦才找到的.希望大家在系统整合时能用的上. 注意: ...
- PHP与Java使用des加密通讯
http://www.pocketdigi.com/20121112/940.html 原文:http://toptulip.iteye.com/blog/780309 使用php加密字符串,生成密文 ...
- (iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题
我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法.我记得我在前一个项目中使用的就是这两种加密算法的结合:Bas ...
- 一个java的DES加密解密类转换成C#
一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...
随机推荐
- 推文科技:AI解决方案助力内容出海
2017年,推文科技成立,推出业内针对网络文学的AI系统,助推网文批量出海.2018年,阿里云上线海外可用区,推文科技开始与阿里云合作. 创业宣言 创业是一件用行动去实践相信的事情,也许有一天,我 ...
- 基于 MaxCompute + Hologres 的人群圈选和数据服务实践
简介: 本文主要介绍如何通过 MaxCompute 进行海量人群的标签加工,通过 Hologres 进行分析建模,从而支持大规模人群复杂圈选场景下的交互式体验,以及基于API的数据服务最佳实践. 本 ...
- 一键启动的AI离线知识库,无需复杂环境依赖,小白都能上手了
简介 在人工智能技术飞速发展的今天,我们经常面临一个挑战:如何快速.简便地部署和使用AI技术?AntSK项目,一个开源的AI知识库和智能体,就是为了解决这一问题而诞生的.现在,我们自豪地宣布,AntS ...
- 第五章-WAF 绕过
WAF 绕过 1.WAF分类 1.1.软件 WAF 一般被安装到 Web 服务器中直接对其进行防护,能够接触到服务器上的文件,直接检测服务器上是否有不安全的文件和操作等. 常见的软件:安全狗.云盾.云 ...
- Swift中的变量与常量
在Swift里面,声明变量用关健字var,声明常量用关健字let.虽然仅仅是声明变量这样的简单功能,但是还是有需要注意的地方. 变量和常量使用之前必须有一次赋值 var a: Int let b: I ...
- 手机自适应的单位rem,与自适应网页的区别
一个网站有的会分为pc站和移动站,有的网站只有pc站,而现在更多的是自适应的站点.现在针对自适应的网页设计有很多模板,如bootstrap,它会让你轻松定制一个只适应网站,而现在大多数的网站并不是靠程 ...
- uniapp中正确使用echart
uniapp中不能直接使用百度echart,要么就只能嵌入html,然后在html中进入echart进行使用,这样非常不方便, 下面介绍这个插件,对百度echart进行局部小改造,使他能在uniapp ...
- Android 开发中脚本 提高效率工具
在安卓开发中我们常常需要获取日志,通常我们可以通过adb logcat 命令获取日志.同样,我没有可以通过脚本获取.其实质也是通过adb命令实现,只是把命名写入bat文件中,在win系统中直接双击就可 ...
- 如果win报错无法加载文件 C:\Users\xx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本
点击查看代码 Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
- 使用 Splashtop 启用员工远程访问
使员工进行远程工作似乎是一项耗时.不安全且昂贵的任务.但是,借助 Splashtop,您可以快速.轻松.安全地使您的员工从任何位置以最高 价值远程访问其工作站. 如何使用 Splashtop 启用 ...