JAVA加密C++解密简单方法
java加密C++解密:【key可以随机生成】需要KEY需要一样(如果需要更为复杂的加密可以在加密器初始化是传入一个盐值,具体实现方法可以网上搜很多),java加密的填充方式 和C++解密填充方式要一样,其中加密解密返回的都是字节数组,将字节数组转换为字符串的方法:base64转或者用16进制的方式转换,加密后的字节数组不能直接new String(“”,字符集)这样是乱码。同一种语言中转换是很方便和简单的 但是java与c++的base64转换存在差别:具体差别找度娘吧!
。当时用的是16进制转换方式,但同样存在C++中需要写一个对应的逆转16进制字符串到byte[] 形式进行解密(这个应该可以实现吧。以下方法中有java的16进制字符串转byte[]经过测试是可以的,但是C++或许会有些要注意的地方,本人学JAVA的 不懂C++),最后选择了一个最简单的方法就是将加密得到的字节数组遍历出来组成一个字符串,C++通过简单处理这个字符串得到byte[]形式。就可以解密了。还有就是字符集环境C++与java不同:这里java端最好用GBK,C++解密后不是乱码 。这里用了取巧的方法 哈哈
这个前辈的博客中讲了文件方式的加解密非常详细:http://blog.sina.com.cn/s/blog_48d4cf2d0101eqdf.html
package com.company.item.desc;
// DES:
//Java加密代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* java加密匹配C++解密类
* @author
* @Date:2015年11月16日
*/
public class DESofJC {
private static BASE64Encoder encoder = new BASE64Encoder();
private static BASE64Decoder decoder = new BASE64Decoder();
// 全局数组
private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
// 测试方法
public static void main(String[] args) throws Exception {
String ss = DESofJC.desEncrypt("java加密数据");
System.out.println(ss.toString());
}
/**
* java端加密方法
*
* @author zt
* @Date 2015年11月16日
* @param source
* @param rawKeyData
* @return
* @throws GeneralSecurityException
*/
public static byte[] desEncrypt(byte[] source, byte rawKeyData[])
throws GeneralSecurityException {
// 处理密钥
SecretKeySpec key = new SecretKeySpec(rawKeyData, "DES");
// 加密器定义
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 初始化加密器
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(source);
}
/**
* java端加密返回字符串
*
* @Date 2015年11月16日
* @param str
* @return
* @throws Exception
*/
// java加密方法,C++可解密,字符集设为GBk c++解密正常
public static String desEncrypt(String str) throws Exception {
// java加密key C++对应的解密key相同,字符集设为GBK与C++字符集编码环境匹配
byte rawKeyData[] = "hellodes".getBytes("GBK");
// 获取字符串字节数组,字符集设为GBK
byte[] source = str.getBytes("GBK");
// 传入key进行加密操作
byte[] enc = desEncrypt(source, rawKeyData);
StringBuilder sb = new StringBuilder();
// 对字节数组进行处理转换为C++端方便处理字符串
for (int i = 0; i < enc.length; i++) {
sb.append(enc[i]).append(",");
}
return sb.toString().substring(0, sb.length() - 1).trim();
}
// 转换字节数组为16进制字串
private static String byteToString(byte[] bByte) {
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < bByte.length; i++) {
sBuffer.append(byteToArrayString(bByte[i]));
}
return sBuffer.toString();
}
// 返回形式为数字跟字符串
private static String byteToArrayString(byte bByte) {
int iRet = bByte;
// System.out.println("iRet="+iRet);
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
return strDigits[iD1] + strDigits[iD2];
}
// 返回形式只为数字
private static String byteToNum(byte bByte) {
int iRet = bByte;
System.out.println("iRet1=" + iRet);
if (iRet < 0) {
iRet += 256;
}
return String.valueOf(iRet);
}
/**
* 字节数组转16进制字符串
*
* @author
* @Date 2015年11月16日
* @param src
* @return
*/
public static String bytesToHexString(byte[] src) {
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
/**
* 16进制字符串转为byte[]
*
* @param hexString
* the hex string
* @return byte[]
*/
public static byte[] hexStringToBytes(String hexString) {
if (hexString == null || hexString.equals("")) {
return null;
}
hexString = hexString.toUpperCase();
int length = hexString.length() / 2;
char[] hexChars = hexString.toCharArray();
byte[] d = new byte[length];
for (int i = 0; i < length; i++) {
int pos = i * 2;
d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
}
return d;
}
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
}
}
JAVA加密C++解密简单方法相关推荐
- Java加密与解密笔记(三) 非对称加密
非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...
- 安全系列之——手写JAVA加密、解密
其他文章: 安全系列之--手写JAVA加密.解密 安全系列之--数据传输的完整性.私密性.源认证.不可否认性 安全系列之--主流Hash散列算法介绍和使用 安全系列之--RSA的公钥私钥有多少人能分的 ...
- java加密与解密-核心包中的部分API(2)
主要是介绍java安全框架的核心包中的部分API作用 java.Security包 java.security包主要用于为安全框架提供类和接口 Provider类 Provider类实现了java ...
- Java加密与解密笔记(四) 高级应用
术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...
- 安卓逆向_25 --- 密码学 之 《Java加密与解密的艺术》
<Java加密与解密的艺术>中文 PDF版 :https://www.jb51.net/books/65048.html 1. 密码学应用 :https://www.bilibili.co ...
- 编程语言php加密与解密的方法
编程语言php加密与解密的方法 测试文件 test.php <?phpecho "hello world.";?> 1.加密方法: <?php /*eval() ...
- java解密方法,java加密,解密方法
/** *AES加密解密工具类 *@author M-Y */ public class AESUtil { private static Logger log = LoggerFactory.get ...
- java加密与解密(二)
七. 高等数据加密--非对称加密算法 我们可能没有在瑞士苏黎世银行存入巨额资产的机会,但相信大多数人都在电影中见到这样一组镜头:户主带着自己的钥匙来到银行,要求取出自己寄放的物品.银行 ...
- java加密与解密工具_cat: CAT,全称Cryptographic Algorithm Tool,是一款小巧的Java加密与解密算法调用工具包...
cat 一.介绍 cat:全称Cryptographic Algorithm Tool 主要提供以下加密算法调用: 1.AES 2.DES 3.DSA 4.MD5 5.MersenneTwister( ...
- Java加密与解密的艺术~AES-GCM-NoPadding实现
来源:Java AES加密和解密_一名可爱的技术搬运工-CSDN博客 高级加密标准 (AES,Rijndael)是一种分组密码加密和解密算法,是全球使用最广泛的加密算法. AES使用128.192或2 ...
最新文章
- (转载)各Linux发行版本 网络配置文件
- python下载word文件-Python用python-docx读写word文档
- C语言的指针*和引用
- 【LeetCode从零单排】No118	Pascal's Triangle
- 台达变频器vfb—d参数表_台达变频器在印刷涂布机上的应用
- % 在C语言中的用法
- Java 并发总结——高并发与同步锁
- 工作中:如何在实际工作中处理 NULL,并给出一些指南
- centOS chkconfig 使用
- 设计模式--策略模式
- 【bzoj1712】[Usaco2007 China]Summing Sums 加密 矩阵乘法
- python做自动化控制postman_Python自动化学习笔记(1)认识接口测试以及postman、Charles工具简单应用...
- 29 岁成为阿里巴巴 P8,工作前 5 年完成晋升 3 连跳,他如何做到?
- 白帽SEO为什么更好?
- 计算机与人脑的优势与缺点,科学网—《计算机与人脑》笔记 - 王龙飞的博文
- ubuntu安装zsh及环境配置
- 银行家算法——C++实现 [ 开源代码 + 详细解析 ]
- lol服务器位置地图,LOL老玩家一定能看懂的地图 每一个地点都充满回忆
- 2021年中国数据安全行业发展现状及未来发展前景分析:数据安全市场快速增长[图]
- 电脑抢票软件-电脑自动化订票软件开发