Java加密与解密方法详解

合集下载

java实现AES加密和解密

java实现AES加密和解密

Java实现AES加密和解密经过三周的不懈努力,终于完成了AES对任意格式的文件加密和解密。

现在将自己的学习经历记下来,纪念自己三周的付出。

同时也感谢网上的各位大神的博客,让我学到了很多。

下面就将AES的各个构件的核心代码粘贴如下,每行代码都有详细的注释!package myAes;/** 本类完成AES的加密和解密的流程//内容参考:* */public class myAes {private byte State[][];// 明文的状态表private byte Sbox[][];// S盒子private byte iSbox[][];// 逆S盒子private byte key[];//密钥private int Nk;// 密钥长度private int Nr;// 对不同的长度的密钥不同的轮数private byte w[][];// 密钥调度表private byte Rcon[][];// 轮常数表private int Nb;// 明文列数//构造函数public myAes(byte[] keyBytes,int keySize) { = 4;//只处理明文是128位为一组if(keySize==128){=4;=10;}else if (keySize==192) {//"密钥长度位192位");=6;=12;}else if (keySize==256) {=8;=14;}= new byte[ * 4];= keyBytes;createSbox();//创建S盒子的方法createISbox();//创建S逆盒子的方法createRcon();//创建轮常数数组的方法keyExtend();//密钥扩展的方法}// 初始化S盒子private void createSbox() {= new byte[][] {{ 0x63, 0x7c, 0x77, 0x7b, (byte) 0xf2, 0x6b, 0x6f, (byte) 0xc5, 0x30, 0x01, 0x67, 0x2b, (byte) 0xfe, (byte) 0xd7, (byte) 0xab, 0x76 },{ (byte) 0xca, (byte) 0x82, (byte) 0xc9, 0x7d, (byte) 0xfa, 0x59, 0x47, (byte) 0xf0, (byte) 0xad, (byte) 0xd4, (byte) 0xa2, (byte) 0xaf, (byte) 0x9c, (byte) 0xa4, 0x72, (byte) 0xc0 },{ (byte) 0xb7, (byte) 0xfd, (byte) 0x93, 0x26, 0x36, 0x3f, (byte) 0xf7, (byte) 0xcc, 0x34, (byte) 0xa5,(byte) 0xe5, (byte) 0xf1, 0x71, (byte) 0xd8, 0x31, 0x15 }, { 0x04, (byte) 0xc7, 0x23, (byte) 0xc3, 0x18,(byte) 0x96, 0x05, (byte) 0x9a, 0x07, 0x12,(byte) 0x80, (byte) 0xe2, (byte) 0xeb, 0x27,(byte) 0xb2, 0x75 },{ 0x09, (byte) 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, (byte) 0xa0, 0x52, 0x3b, (byte) 0xd6, (byte) 0xb3,0x29, (byte) 0xe3, 0x2f, (byte) 0x84 },{ 0x53, (byte) 0xd1, 0x00, (byte) 0xed, 0x20,(byte) 0xfc, (byte) 0xb1, 0x5b, 0x6a, (byte) 0xcb, (byte) 0xbe, 0x39, 0x4a, 0x4c, 0x58, (byte) 0xcf },{ (byte) 0xd0, (byte) 0xef, (byte) 0xaa, (byte) 0xfb,0x43, 0x4d, 0x33, (byte) 0x85, 0x45, (byte) 0xf9, 0x02,0x7f, 0x50, 0x3c, (byte) 0x9f, (byte) 0xa8 },{ 0x51, (byte) 0xa3, 0x40, (byte) 0x8f, (byte) 0x92,(byte) 0x9d, 0x38, (byte) 0xf5, (byte) 0xbc,(byte) 0xb6, (byte) 0xda, 0x21, 0x10, (byte) 0xff, (byte) 0xf3, (byte) 0xd2 },{ (byte) 0xcd, 0x0c, 0x13, (byte) 0xec, 0x5f,(byte) 0x97, 0x44, 0x17, (byte) 0xc4, (byte) 0xa7,0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73 },{ 0x60, (byte) 0x81, 0x4f, (byte) 0xdc, 0x22, 0x2a, (byte) 0x90, (byte) 0x88, 0x46, (byte) 0xee,(byte) 0xb8, 0x14, (byte) 0xde, 0x5e, 0x0b, (byte) 0xdb }, { (byte) 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, (byte) 0xc2, (byte) 0xd3, (byte) 0xac, 0x62,(byte) 0x91, (byte) 0x95, (byte) 0xe4, 0x79 },{ (byte) 0xe7, (byte) 0xc8, 0x37, 0x6d, (byte) 0x8d, (byte) 0xd5, 0x4e, (byte) 0xa9, 0x6c, 0x56,(byte) 0xf4, (byte) 0xea, 0x65, 0x7a, (byte) 0xae, 0x08 },{ (byte) 0xba, 0x78, 0x25, 0x2e, 0x1c, (byte) 0xa6, (byte) 0xb4, (byte) 0xc6, (byte) 0xe8, (byte) 0xdd,0x74, 0x1f, 0x4b, (byte) 0xbd, (byte) 0x8b, (byte) 0x8a }, { 0x70, 0x3e, (byte) 0xb5, 0x66, 0x48, 0x03,(byte) 0xf6, 0x0e, 0x61, 0x35, 0x57, (byte) 0xb9,(byte) 0x86, (byte) 0xc1, 0x1d, (byte) 0x9e },{ (byte) 0xe1, (byte) 0xf8, (byte) 0x98, 0x11, 0x69, (byte) 0xd9, (byte) 0x8e, (byte) 0x94, (byte) 0x9b,0x1e, (byte) 0x87, (byte) 0xe9, (byte) 0xce, 0x55,0x28, (byte) 0xdf },{ (byte) 0x8c, (byte) 0xa1, (byte) 0x89, 0x0d,(byte) 0xbf, (byte) 0xe6, 0x42, 0x68, 0x41,(byte) 0x99, 0x2d, 0x0f, (byte) 0xb0, 0x54,(byte) 0xbb, 0x16 }};}/*生成S逆盒子:*我的思路:得到s盒中一个元素的高四位和低四位,分别作为s逆盒子的行和列。

Java实现MD5加密及解密的代码实例分享

Java实现MD5加密及解密的代码实例分享

Java实现MD5加密及解密的代码实例分享基础:MessageDigest类的使⽤其实要在Java中完成MD5加密,MessageDigest类⼤部分都帮你实现好了,⼏⾏代码⾜矣:/*** 对字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static String getMD5(String str) {try {// ⽣成⼀个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");// 计算md5函数md.update(str.getBytes());// digest()最后确定返回md5 hash值,返回值为8为字符串。

因为md5 hash值是16位的hex值,实际上就是8位的字符// BigInteger函数则将8位的字符串转换成16位hex值,⽤字符串来表⽰;得到字符串形式的hash值return new BigInteger(1, md.digest()).toString(16);} catch (Exception e) {throw new SpeedException("MD5加密出现错误");}}进阶:加密及解密类Java实现MD5加密以及解密类,附带测试类,具体见代码。

MD5加密解密类——MyMD5Util,代码如下package com.zyg.security.md5;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Arrays;public class MyMD5Util {private static final String HEX_NUMS_STR="0123456789ABCDEF";private static final Integer SALT_LENGTH = 12;/*** 将16进制字符串转换成字节数组* @param hex* @return*/public static byte[] hexStringToByte(String hex) {int len = (hex.length() / 2);byte[] result = new byte[len];char[] hexChars = hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4| HEX_NUMS_STR.indexOf(hexChars[pos + 1]));}return result;}/*** 将指定byte数组转换成16进制字符串* @param b* @return*/public static String byteToHexString(byte[] b) {StringBuffer hexString = new StringBuffer();for (int i = 0; i < b.length; i++) {String hex = Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}hexString.append(hex.toUpperCase());}return hexString.toString();}/*** 验证⼝令是否合法* @param password* @param passwordInDb* @return* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static boolean validPassword(String password, String passwordInDb)throws NoSuchAlgorithmException, UnsupportedEncodingException {//将16进制字符串格式⼝令转换成字节数组byte[] pwdInDb = hexStringToByte(passwordInDb);//声明盐变量byte[] salt = new byte[SALT_LENGTH];//将盐从数据库中保存的⼝令字节数组中提取出来System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);//创建消息摘要对象MessageDigest md = MessageDigest.getInstance("MD5");//将盐数据传⼊消息摘要对象md.update(salt);//将⼝令的数据传给消息摘要对象md.update(password.getBytes("UTF-8"));//⽣成输⼊⼝令的消息摘要byte[] digest = md.digest();//声明⼀个保存数据库中⼝令消息摘要的变量byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];//取得数据库中⼝令的消息摘要System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length); //⽐较根据输⼊⼝令⽣成的消息摘要和数据库中消息摘要是否相同if (Arrays.equals(digest, digestInDb)) {//⼝令正确返回⼝令匹配消息return true;} else {//⼝令不正确返回⼝令不匹配消息return false;}}/*** 获得加密后的16进制形式⼝令* @param password* @return* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static String getEncryptedPwd(String password)throws NoSuchAlgorithmException, UnsupportedEncodingException {//声明加密后的⼝令数组变量byte[] pwd = null;//随机数⽣成器SecureRandom random = new SecureRandom();//声明盐数组变量byte[] salt = new byte[SALT_LENGTH];//将随机数放⼊盐变量中random.nextBytes(salt);//声明消息摘要对象MessageDigest md = null;//创建消息摘要md = MessageDigest.getInstance("MD5");//将盐数据传⼊消息摘要对象md.update(salt);//将⼝令的数据传给消息摘要对象md.update(password.getBytes("UTF-8"));//获得消息摘要的字节数组byte[] digest = md.digest();//因为要在⼝令的字节数组中存放盐,所以加上盐的字节长度pwd = new byte[digest.length + SALT_LENGTH];//将盐的字节拷贝到⽣成的加密⼝令字节数组的前12个字节,以便在验证⼝令时取出盐 System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);//将消息摘要拷贝到加密⼝令字节数组从第13个字节开始的字节System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);//将字节数组格式加密后的⼝令转化为16进制字符串格式的⼝令return byteToHexString(pwd);}}测试类——Client,代码如下:package com.zyg.security.md5;import java.io.UnsupportedEncodingException;import java.security.NoSuchAlgorithmException;import java.util.HashMap;import java.util.Map;public class Client {private static Map users = new HashMap();public static void main(String[] args){String userName = "zyg";String password = "123";registerUser(userName,password);userName = "changong";password = "456";registerUser(userName,password);String loginUserId = "zyg";String pwd = "1232";try {if(loginValid(loginUserId,pwd)){System.out.println("欢迎登陆");}else{System.out.println("⼝令错误,请重新输⼊");}} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 注册⽤户** @param userName* @param password*/public static void registerUser(String userName,String password){String encryptedPwd = null;try {encryptedPwd = MyMD5Util.getEncryptedPwd(password);users.put(userName, encryptedPwd);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 验证登陆** @param userName* @param password* @return* @throws UnsupportedEncodingException* @throws NoSuchAlgorithmException*/public static boolean loginValid(String userName,String password)throws NoSuchAlgorithmException, UnsupportedEncodingException{String pwdInDb = (String)users.get(userName);if(null!=pwdInDb){ // 该⽤户存在return MyMD5Util.validPassword(password, pwdInDb);}else{System.out.println("不存在该⽤户");return false;}}}PS:这⾥再为⼤家提供2款MD5加密⼯具,感兴趣的朋友可以参考⼀下:MD5在线加密⼯具:在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密⼯具:。

Java加解密

Java加解密

Java加解密⼀、概述 Jasypt 这个Java类包为开发⼈员提供⼀种简单的⽅式来为项⽬增加加密功能,包括:密码Digest认证,⽂本和对象加密,集成hibernate,Spring Security(Acegi)来增强密码管理。

Jasypt是⼀个Java库,可以使开发者不需太多操作来给Java项⽬添加基本加密功能,⽽且不需要知道加密原理。

根据Jasypt⽂档,该技术可⽤于加密任务与应⽤程序,例如加密密码、敏感信息和数据通信、创建完整检查数据的sums. 其他性能包括⾼安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、⽂本、数字和⼆进制⽂件。

Jasypt也可以与Acegi Security整合也即Spring Security。

Jasypt亦拥有加密应⽤配置的集成功能,⽽且提供⼀个开放的API从⽽任何⼀个Java Cryptography Extension都可以使⽤Jasypt。

Jasypt还符合RSA标准的基于密码的加密,并提供了⽆配置加密⼯具以及新的、⾼可配置标准的加密⼯具。

1、该开源项⽬可⽤于加密任务与应⽤程序,例如加密密码、敏感信息和数据通信 2、还包括⾼安全性、基于标准的加密技术、可同时单向和双向加密的加密密码、⽂本、数字和⼆进制⽂件。

3、Jasypt还符合RSA标准的基于密码的加密,并提供了⽆配置加密⼯具以及新的、⾼可配置标准的加密⼯具。

4、加密属性⽂件(encryptable properties files)、Spring work集成、加密Hibernate数据源配置、新的命令⾏⼯具、URL加密的Apache wicket集成以及升级⽂档。

5、Jasypt也可以与Acegi Security整合也即Spring Security。

Jasypt亦拥有加密应⽤配置的集成功能,⽽且提供⼀个开放的API从⽽任何⼀个Java Cryptography Extension都可以使⽤Jasypt。

java hmacsha256 解密方法

java hmacsha256 解密方法

java hmacsha256 解密方法Java中的HmacSHA256解密方法HmacSHA256是一种基于散列函数(Hash Function)的消息认证码(Message Authentication Code,简称MAC)算法,它使用SHA-256散列函数和一个密钥来对消息进行加密和验证。

在Java中,我们可以使用javax.crypto包提供的类来实现HmacSHA256的加密和解密操作。

我们需要导入javax.crypto和java.security包中的相关类:```javaimport javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;```接下来,我们可以定义一个方法来实现HmacSHA256的解密操作:```javapublic static String hmacSha256(String message, String key) {try {Mac sha256_HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");sha256_HMAC.init(secret_key);byte[] hash = sha256_HMAC.doFinal(message.getBytes()); StringBuilder result = new StringBuilder();for (byte b : hash) {result.append(String.format("%02x", b));}return result.toString();} catch (NoSuchAlgorithmException | InvalidKeyException e) {e.printStackTrace();}return null;}```在上述代码中,我们首先通过Mac.getInstance("HmacSHA256")方法获取HmacSHA256算法的实例。

加密接口的加密解密方法

加密接口的加密解密方法

加密接⼝的加密解密⽅法⼀、加密的⽅法有很多,我⽬前知道的⼏个java对应的python加密⽅法有下列这⼏个:1.RSA/ECB/PKCS1Padding(java加密⽅法)对应的是 encrypt(python加密⽅法)模式encrypt.py# -*- coding:utf-8-*- python的加密⽅法import base64import jsonfrom config import *import requestsfrom Crypto.Hash import MD5from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5from Crypto.PublicKey import RSAproxies = {'http': 'http://localhost:8888', 'https': 'http://localhost:8888'} #可以同步到fiddler抓包软件上def get_encrypt_data(params):"""分段加密"""params = json.dumps(params)params = params.encode("utf-8")length = len(params)print(f"加密内容为{params},加密的长度为:{length}")default_length = 117if length < default_length:# print(base64.b64encode(encrypt_data(params)))return base64.b64encode(encrypt_data(params))offset = 0params_lst = []while length - offset > 0:if length - offset > default_length:params_lst.append(encrypt_data(params[offset:offset + default_length]))else:params_lst.append(encrypt_data(params[offset:]))offset += default_lengthnew_str = params_lst[0] + params_lst[1]return base64.b64encode(new_str).decode("utf-8")def encrypt_data(params):"""使⽤公钥对数据加密"""# 测试环境publickey = securityCode()key = f"""-----BEGIN RSA PUBLIC KEY-----\n{publickey}\n-----END RSA PUBLIC KEY-----\n""" #publickey 密钥# 海外# key = f"""-----BEGIN RSA PUBLIC KEY-----\n{public}# \n-----END RSA PUBLIC KEY-----\n"""rakes = RSA.importKey(key)cipher = Cipher_pkcs1_v1_5.new(rakes)text = cipher.encrypt(params)return text密钥## def sign_data(params): #另外⼀种加密⽅式# """对数据签名(加密)"""# key = private_key# rsakey = RSA.importKey(base64.b64decode(key))# signer = Signature_pkcs1_v1_5.new(rsakey)# digest = MD5.new(params)# sign = signer.sign(digest)# return base64.b64encode(sign)def auth_login():"""测试环境登录接⼝:return:"""url = "https:///auth/auth/login?tenantId=f3M/A/aIDuv7VltXYaTbA0U4KhTbs4AgsVvYyz08EhqG3uofh+/eXYtaFoFhS3ip5yQr0z3PrRoH+7xFkEMvbWxconHFG8cqFsnnfaKn2sI/FhjlD/depaZGzSbeE9gOnhQyalwBzrj0grnndEq header = {"Content-Type": "application/json;charset=utf-8","Encrypt": 'true',"EncryptVersion": "2.0","t-store-uuid": 'TCL+',"t-app-version": "1.6.1.24","t-platform-type": "Android"}data = {"channel": "app","deviceId": "android--4707706256531588119-1639619498082","password": "fd7ede4cc9f45afbe00acd31e4056a3d","username": "137********"}res = requests.post(url=url, data=get_encrypt_data(data), headers=header, verify=False)print(res.json())def encrypt(mess):url = "http://127.0.0.1:8899/test/encrypt"body = {"name": mess}res = requests.post(url=url, data=body)print(res.text)return res.textdef logoutByPassword():"""海外登出:return:"""base_url = 'https://'url = f"{base_url}/account/logoutByPassword?clientId=99999999&username=guopeng4321@&token=eyJhbGciOiJSUzI1NiJ9" \f".eyJleHAiOjE2NDIyMzU1MjIsImlhdCI6MTYzOTY0MzUyMiwidXNlcm5hbWUiOiI2ODg0NDIyNzIifQ" \f".sUmF8Nh5c7ALEJKhpCb_dUNENuvygafAQ0h6i0I6YyC2DkkWmYLy-AJEbeZYbzAei2WSkH" \f"-nhFbAuI2JBSs_Bkvgwk7zW7S8ssXQ82STqDb_ROdcX8gndI1ZpM082oR2pfCjsRZC50ds_BSfHbQEgkZ9OUAk4bXCojgOJe_rv7U"data = {# "encryptPwd": get_encrypt_data("16d7a4fca7442dda3ad93c9a726597e4").decode("utf-8")"encryptPwd": encrypt("16d7a4fca7442dda3ad93c9a726597e4")# "encryptPwd":"SogxeFPdMOMzqUJ7RJUTMOSAEIrClGW/WkuhmDilia83B6rG2LAyCGgOTT6MH3LDnUs8evqAacmJsYXTdr55WxC/dGGRmiNH3fcMzcv4E4l2euWnrzsEGtcfOIDQlxZbTNB+TkaW0QShEO17kqUZz1mhEoVAqjFzljecI/iF1Y }res = requests.post(url=url, json=data, verify=False)print(f"请求的{url}")print(res.json())def logining():url = "/rest/sysmanager/login"body = {"account": get_encrypt_data("tclplus"), "password": get_encrypt_data("kuyu@123"),"systemType": "shop_store", "tenantId": "TCL"}header = {"t-id": "TCL"}res = requests.post(url=url, json=body, headers=header, verify=False, proxies=proxies)print(f"请求的{url}")print(res.json())if __name__ == '__main__':# get_encrypt_data("123456")# auth_login()# logoutByPassword()# encrypt("16d7a4fca7442dda3ad93c9a726597e4")# securityCode()logining()2.RSA(java加密⽅法)对应的是nopadding(python加密⽅法)模式# -*- coding: utf-8 -*-import base64import requestsimport rsafrom Crypto.PublicKey import RSAfrom config import *def padding(s):b = bytes(s.encode())for i in range(128 - len(b)):b = b'\x00' + b# print(b)return b## def encrypt(mess):# url = "http://127.0.0.1:8899/test/encrypt"# body = {# "name": mess# }# res = requests.post(url=url, data=body)# # print(res.text)# return res.textclass RsaNodding:def __init__(self):public = securityCode()key = f"""-----BEGIN RSA PUBLIC KEY-----\n{public}\n-----END RSA PUBLIC KEY-----\n""" #密钥同上self.pubkey = RSA.importKey(key)def encrypt(self, message):kLen = mon.byte_size(self.pubkey.n)msg = padding(message)_b = rsa.transform.bytes2int(msg)_i = rsa.core.encrypt_int(_b, self.pubkey.e, self.pubkey.n)result = rsa.transform.int2bytes(_i, kLen)result = (base64.b16decode(result.hex().upper()))# print(base64.b64encode(result))return base64.b64encode(result)def logoutByPassword():"""海外登出:return:"""base_url = 'https://'url = f"{base_url}/account/logoutByPassword?clientId=99999999&username=guopeng4321@&token" \f"=eyJhbGciOiJSUzI1NiJ9.eyJleHAiOjE2NDIyMzg3OTQsImlhdCI6MTYzOTY0Njc5NCwidXNlcm5hbWUiOiI2ODg0NDIyNzIifQ" \f".uM32m4Di3FdYdVx3CG2g17wn5f3tVN9rSxOoGY0EHmIvnxUKLzDSFB8GmlIKyozGOXsb6bGpceDvSAzED37IaJMlzkE9XwM0TYoLaimBB_h4CKkJyPWAuW1GiRTDDOG9b-gS6P3K8ietMInKft17EM6HzwkAPm59_soitu9_uEI"data = {"encryptPwd": RsaNodding().encrypt("16d7a4fca7442dda3ad93c9a726597e4").decode("utf-8")}print(f"请求参数为:{data}")print(url)res = requests.post(url=url, json=data, verify=False)print(res.json())def logining():url = "/rest/sysmanager/login"body = {"account": RsaNodding().encrypt("tclplus").decode("utf-8"), "password": RsaNodding().encrypt("kuyu@123").decode("utf-8"),"systemType": "shop_store", "tenantId": "TCL"}header = {"t-id": "TCL"}res = requests.post(url=url, json=body, headers=header, verify=False, proxies=proxies)print(f"请求的{url}")print(res.json())# def comprise(args):# """# 对⽐# :return:# """# result = encrypt(args)# result1 = RsaNodding().encrypt(args).decode("utf-8")# if result == result1:# print(f"java的加密结果和python的加密结果⼀样:\n加密结果为{result}")# 解密if __name__ == '__main__':# logoutByPassword()# RsaNodding().encrypt("16d7a4fca7442dda3ad93c9a726597e4")# comprise("16d7a4fca7442dda3ad93c9a726597e4")logining()3.RSA/ECB/PKCS1OAEPPadding(java加密⽅法)对应的是 RSA.pkcs1_oaep_padding(python加密⽅法)模式。

java 通用的aes256加密方法

java 通用的aes256加密方法

java 通用的aes256加密方法摘要:1.AES256加密算法简介2.Java实现AES256加密方法3.应用场景及实例正文:一、AES256加密算法简介AES(高级加密标准,Advanced Encryption Standard)是一种对称加密算法,密钥长度分为128位、192位和256位。

AES256是其中安全性最高的一种,因其加密处理轮数更多,故安全性更高。

AES256算法主要包括以下几个部分:明文分组、密钥加密、初始向量IV、填充方式等。

二、Java实现AES256加密方法在Java中,我们可以使用Java Cryptography Extension(JCE)实现AES256加密。

以下是一个通用的Java AES256加密方法:```javaimport javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Base64;public class AES256Util {private static final String ALGORITHM = "AES256";private static final String IV_ALGORITHM ="AES/CBC/PKCS5Padding";public static String encrypt(String secretKey, String content) { try {SecretKey key = newSecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);Cipher cipher = Cipher.getInstance(IV_ALGORITHM);byte[] iv = new byte[16];new SecureRandom().nextBytes(iv);IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);byte[] encryptedContent =cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));returnBase64.getEncoder().encodeToString(encryptedContent);} catch (Exception e) {throw new RuntimeException("AES256 encryption failed", e);}}// 解密方法省略,参考上述加密方法的实现方式}```三、应用场景及实例1.加密文件:可以利用AES256加密算法对文件进行加密和解密,确保数据安全。

Java使用Cipher类实现加密的过程详解

Java使用Cipher类实现加密的过程详解

Java使⽤Cipher类实现加密的过程详解⼀、先看⼀个简单加密,解密实现1.1 加密/*** content: 加密内容* slatKey: 加密的盐,16位字符串* vectorKey: 加密的向量,16位字符串*/public String encrypt(String content, String slatKey, String vectorKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] encrypted = cipher.doFinal(content.getBytes());return Base64.encodeBase64String(encrypted);}1.2 解密/*** content: 解密内容(base64编码格式)* slatKey: 加密时使⽤的盐,16位字符串* vectorKey: 加密时使⽤的向量,16位字符串*/public String decrypt(String base64Content, String slatKey, String vectorKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] content = Base64.decodeBase64(base64Content);byte[] encrypted = cipher.doFinal(content);return new String(encrypted);}1.3 代码解释上⾯简单实现了AES("AES/CBC/PKCS5Padding")的加密和解密。

Java使用数字证书加密文件(含代码)

Java使用数字证书加密文件(含代码)

JA V A 使用数字证书加密解密文件总结目录1.编写目的 (3)2.JA V A生产数字证书 (4)2.1.1 keystore(JKS) 的生成 (4)2.1.2 导出公钥 (5)3.使用JKS私钥加密文件 (5)4.转换为PFX格式私钥 (6)5.使用PFX加密文件 (7)6 源代码 (8)6.1 用到的JAR包 (8)6.2 示例代码 (8)6.2.1 Test.java (8)6.2.2 RsaUtil.java (10)6.2.3 Base64.java (19)7.结束语 (26)1.编写目的学习RSA算法,读取数字证书中的私钥对文件进行加密,使用数字证书的公钥解密,这种方式就是RSA算法.自己对RSA算法的理解:⏹私钥加密公钥解密:如果用私钥对文件加密,发给别人,别人用我公布的公钥进行解密,实现这个文件就是我本人制作的,不是别人做的.⏹公钥加密私钥解密:如果别人用我的公钥加密文件,那么只能我一个人看,只有使用我的私钥进行解密,私钥一定是不能告诉其他人的.本文讲解如何用JKS私钥对文件进行加密,用对于CRT公钥进行解密,将JKS私钥转换为PFX格式私钥,并用PFX私钥对文件进行加密解密Jks:是JA V A的keytools证书工具支持的证书私钥格式pfx:是微软支持的私钥格式⏹2.JAVA生产数字证书为了实现数字证书加密文件,我们首先要制作几个数字证书,如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.2.1 keytool 创建数字证书Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:⏹密钥实体(Key entity):密钥(secret key)又或者是私钥⏹配对公钥(采用非对称加密):可信任的证书实体(trusted certificate entries),只包含公钥2.1.1 keystore(JKS) 的生成●分阶段生成:命令格式:keytool -genkey -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期,天单位) -keystore e:\yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码);示例:1)cmd下进入java/bin2)输入命令keytool -genkey -alias myalias-keypass 123456-keyalg RSA-keysize 1024 -validity 365 -keystore d: \myalias.keystore -storepass 123456●一次性生成:keytool -genkey -alias yushan -keypass yushan -keyalg RSA -keysize 1024 -validity 365 -keystore e:\yushan.keystore -storepass 123456 -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)";(中英文即可)无例图2.1.2 导出公钥命令:keytool -export -alias myalias -keystore d:\myalias.keystore -file d:\myalias.crt -storepass 123456创建结果:3.使用JKS私钥加密文件//工具类RSAUtil rsa = new RSAUtil();//从jks私钥中获取私钥加密串PrivateKey priKeyFromKs = rsa.getPriKeyFromKS("d:\\myalias.keystore","123456", "myalias", "123456");//从jks私钥中获取公钥解密串PublicKey pubKeyFromKS = rsa.getPubKeyFromKS("d:\\myalias.keystore", "123456", "myalias");//从crt公钥中获取公钥解密串PublicKey pubKeyFromCrt = rsa.getPubKeyFromCRT("d:\\myalias.crt");//用私钥串加密rsa.encryptWithPrv("d:\\file.xml",priKeyFromKs,"d:\\file_encWithKSPri.xml", true);//用jks公钥串解密rsa.decryptWithPub("d:\\file_encWithKSPri.xml", pubKeyFromKS, true,"d:\\file_encWithKSPri_decKs.xml");//用crt公钥串解密rsa.decryptWithPub("d:\\file_encWithKSPri.xml", pubKeyFromCrt, true, "d:\\file_encWithKSPri_decCrt.xml");4.转换为PFX格式私钥如果你已经有了pfx格式的数字证书并且知道其密码,以及对应crt或者cer格式的公钥证书则跳过本章.4.1 转换工具转换工具我使用的是kestore-export下载kestore-export.rar 请百度搜索,我也会往CSDN上上传,请直接搜索kestore-export.rar。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java加密与解密方法详解
1. 引言
在当今数字化时代,保护数据的安全性成为了一项重要的任务。

无论是在个人
使用还是企业应用中,数据的加密和解密都是必不可少的环节。

而Java作为一门
广泛应用于软件开发的编程语言,其提供了丰富的加密和解密方法,本文将对
Java中的加密与解密方法进行详细的介绍和分析。

2. 对称加密算法
对称加密算法是指加密和解密使用相同的密钥的算法。

Java中常用的对称加密
算法有DES、AES等。

其中,DES是一种较早期的对称加密算法,它使用56位的
密钥对数据进行加密和解密。

而AES是一种更加安全和高效的对称加密算法,它
使用128位、192位或256位的密钥对数据进行加密和解密。

在Java中,使用对称加密算法进行加密和解密的步骤如下:
(1)生成密钥:通过密钥生成器(KeyGenerator)生成一个密钥(Key)。

(2)初始化加密/解密器:通过Cipher类的getInstance方法获取加密/解密器,并设置加密/解密模式和密钥。

(3)加密/解密数据:调用加密/解密器的方法对数据进行加密/解密操作。

3. 非对称加密算法
非对称加密算法是指加密和解密使用不同的密钥的算法。

Java中常用的非对称
加密算法有RSA、DSA等。

其中,RSA是一种基于大数因子分解的非对称加密算法,它使用公钥和私钥对数据进行加密和解密。

在Java中,使用非对称加密算法进行加密和解密的步骤如下:
(1)生成密钥对:通过密钥对生成器(KeyPairGenerator)生成一个密钥对(KeyPair)。

(2)获取公钥和私钥:通过密钥对获取公钥和私钥。

(3)初始化加密/解密器:通过Cipher类的getInstance方法获取加密/解密器,并设置加密/解密模式和密钥。

(4)加密/解密数据:调用加密/解密器的方法对数据进行加密/解密操作。

4. 哈希算法
哈希算法是一种将任意长度的数据映射为固定长度的数据的算法。

Java中常用
的哈希算法有MD5、SHA-1、SHA-256等。

其中,MD5是一种常用的哈希算法,
它将数据映射为128位的哈希值。

在Java中,使用哈希算法进行数据加密的步骤如下:
(1)获取消息摘要对象:通过MessageDigest类的getInstance方法获取消息摘
要对象。

(2)更新数据:调用消息摘要对象的update方法更新数据。

(3)生成哈希值:调用消息摘要对象的digest方法生成哈希值。

5. 数字签名
数字签名是一种用于验证数据完整性和身份认证的技术。

Java中常用的数字签
名算法有DSA、RSA等。

其中,DSA是一种基于离散对数问题的数字签名算法,
它使用私钥对数据进行签名,使用公钥对签名进行验证。

在Java中,使用数字签名进行数据签名和验证的步骤如下:
(1)生成密钥对:通过密钥对生成器(KeyPairGenerator)生成一个密钥对(KeyPair)。

(2)获取私钥和公钥:通过密钥对获取私钥和公钥。

(3)初始化签名/验证器:通过Signature类的getInstance方法获取签名/验证器,并设置签名/验证模式和密钥。

(4)签名/验证数据:调用签名/验证器的方法对数据进行签名/验证操作。

6. 总结
本文对Java中的加密与解密方法进行了详细的介绍和分析。

通过对对称加密算法、非对称加密算法、哈希算法和数字签名的讲解,读者可以了解到Java中各种加密与解密方法的原理和使用方法。

在实际应用中,根据数据的安全性需求和性能要求,选择合适的加密与解密方法是至关重要的。

同时,为了保证数据的完整性和身份认证,数字签名技术也是一种有效的手段。

通过合理使用Java中的加密与解密方法,可以保护数据的安全性,防止数据被非法获取和篡改。

相关文档
最新文档