java加密方法
SpringBoot中_JAVA利用国密算法_实现内容的加密_解密

首先来看一下什么是国密算法:国密即国家密码局认定的国产密码算法,即商用密码。
国密主要有SM1,SM2,SM3,SM4。
密钥长度和分组长度均为128位。
1、SM1 为对称加密。
其加密强度与AES(高级加密标准,Advanced Encryption Standard)相当。
该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
2、SM2为非对称加密,基于ECC。
该算法已公开。
由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。
ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
3、SM3为消息摘要。
可以用MD5作为对比理解。
该算法已公开。
校验结果为256位。
4、SM4为无线局域网标准的分组数据算法。
对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
在很多地方还是会用到的,这里说一下这个:SM21.在pom.xml中引入依赖jar包:<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.58</version></dependency>2.然后来写一个工具类,用来生成国密的,公钥和私钥这个密码对.import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.security.*;import java.security.spec.ECGenParameterSpec;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Base64;/*** @author hulala* @Description 国密公私钥对工具类public class KeyUtils {/*** 生成国密公私钥对** @return* @throws Exception*/public static String[] generateSmKey() throws Exception {KeyPairGenerator keyPairGenerator = null;SecureRandom secureRandom = new SecureRandom();ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");keyPairGenerator = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());keyPairGenerator.initialize(sm2Spec);keyPairGenerator.initialize(sm2Spec, secureRandom);KeyPair keyPair = keyPairGenerator.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();//String[0] 公钥//String[1] 私钥String[] result = {new String(Base64.getEncoder().encode(publicKey.getEncoded())), new String(Base64.getEncoder().encode(privateKey.getEncoded())) };return result;}/*** 将Base64转码的公钥串,转化为公钥对象** @param publicKey* @return*/public static PublicKey createPublicKey(String publicKey) {PublicKey publickey = null;try {X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());publickey = keyFactory.generatePublic(publicKeySpec);} catch (Exception e) {e.printStackTrace();}return publickey;}/*** 将Base64转码的私钥串,转化为私钥对象** @param privateKey* @return*/public static PrivateKey createPrivateKey(String privateKey) {PrivateKey publickey = null;try {PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());publickey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);} catch (Exception e) {e.printStackTrace();}return publickey;}}3.根据公钥和私钥工具类,生成的密钥对,对数据,进行加密和解密操作import org.bouncycastle.asn1.gm.GMObjectIdentifiers;import org.bouncycastle.crypto.InvalidCipherTextException;import org.bouncycastle.crypto.engines.SM2Engine;import org.bouncycastle.crypto.params.ECDomainParameters;import org.bouncycastle.crypto.params.ECPrivateKeyParameters;import org.bouncycastle.crypto.params.ECPublicKeyParameters;import org.bouncycastle.crypto.params.ParametersWithRandom;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.jce.spec.ECParameterSpec;import java.security.*;/*** @author hulala* @Description SM2实现工具类*/public class Sm2Util {static {Security.addProvider(new BouncyCastleProvider());}/*** 根据publicKey对原始数据data,使用SM2加密** @param data* @param publicKey* @return*/public static byte[] encrypt(byte[] data, PublicKey publicKey) {ECPublicKeyParameters localECPublicKeyParameters = null;if (publicKey instanceof BCECPublicKey) {BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey;ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),localECParameterSpec.getG(), localECParameterSpec.getN());localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), localECDomainParameters);}SM2Engine localSM2Engine = new SM2Engine();localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom()));byte[] arrayOfByte2;try {arrayOfByte2 = localSM2Engine.processBlock(data, 0, data.length);return arrayOfByte2;} catch (InvalidCipherTextException e) {e.printStackTrace();return null;}}/*** 根据privateKey对加密数据encodedata,使用SM2解密** @param encodedata* @param privateKey* @return*/public static byte[] decrypt(byte[] encodedata, PrivateKey privateKey) {SM2Engine localSM2Engine = new SM2Engine();BCECPrivateKey sm2PriK = (BCECPrivateKey) privateKey;ECParameterSpec localECParameterSpec = sm2PriK.getParameters();ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),localECParameterSpec.getG(), localECParameterSpec.getN());ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(sm2PriK.getD(),localECDomainParameters);localSM2Engine.init(false, localECPrivateKeyParameters);try {byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedata, 0, encodedata.length);return arrayOfByte3;} catch (InvalidCipherTextException e) {e.printStackTrace();return null;}}/*** 私钥签名** @param data* @param privateKey* @return* @throws Exception*/public static byte[] signByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception { Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initSign(privateKey);sig.update(data);byte[] ret = sig.sign();return ret;}/*** 公钥验签** @param data* @param publicKey* @param signature* @return* @throws Exception*/public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception {Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initVerify(publicKey);sig.update(data);boolean ret = sig.verify(signature);return ret;}}4.来测试一下,对数据进行加密解密import org.junit.Test;import java.util.Base64;/*** @author hulala* @Description Sm2Util 的测试类*/public class Sm2UtilTest {private String testStr = "wangjing";java.security.PublicKey publicKey = null;java.security.PrivateKey privateKey = null;@Testpublic void test() throws Exception {//生成公私钥对String[] keys = KeyUtils.generateSmKey();System.out.println("原始字符串:" + testStr);System.out.println("公钥:" + keys[0]);publicKey = KeyUtils.createPublicKey(keys[0]);System.out.println("私钥:" + keys[1]);privateKey = KeyUtils.createPrivateKey(keys[1]);System.out.println("");byte[] encrypt = Sm2Util.encrypt(testStr.getBytes(), publicKey);String encryptBase64Str = Base64.getEncoder().encodeToString(encrypt);System.out.println("加密数据:" + encryptBase64Str);byte[] decode = Base64.getDecoder().decode(encryptBase64Str);byte[] decrypt = Sm2Util.decrypt(decode, privateKey);System.out.println("解密数据:" + new String(decrypt));byte[] sign = Sm2Util.signByPrivateKey(testStr.getBytes(), privateKey);System.out.println("数据签名:" + Base64.getEncoder().encodeToString(sign));boolean b = Sm2Util.verifyByPublicKey(testStr.getBytes(), publicKey, sign);System.out.println("数据验签:" + b);}}5.这样就实现了利用国密,SM2进行加密解密了.。
java中常用的md5方法

java中常用的md5方法Java是一种广泛使用的编程语言,特别适合用于开发各种类型的应用程序。
在Java中,MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,用于产生唯一的消息摘要。
本文将详细介绍在Java中常用的MD5方法。
第一步:导入相关的包使用MD5算法需要导入Java的Security包。
在代码的开头加上以下导入语句:import java.security.MessageDigest;第二步:创建一个方法在Java中,我们可以创建一个方法用于计算MD5消息摘要。
下面是一个示例:public static String getMD5(String input) {try {MessageDigest md =MessageDigest.getInstance("MD5"); 创建MD5加密对象byte[] messageDigest = md.digest(input.getBytes()); 获取二进制摘要值转化为十六进制字符串形式StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xFF & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();} catch (Exception ex) {ex.printStackTrace();return null;}}第三步:调用方法要使用这个方法,只需在代码中调用getMD5()方法,并传递要进行MD5加密的消息作为参数。
以下是一个使用示例:String input = "Hello World";String md5Hash = getMD5(input);System.out.println("MD5加密后的结果:" + md5Hash);以上代码将输出:MD5加密后的结果:0a4d55a8d778e5022fab701977c5d840第四步:解释代码让我们来解释一下上面的代码。
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逆盒子的行和列。
javasm3加密算法

javasm3加密算法1.准备⼯作 所需jar包: bcprov-jdk15on-1.59.jar commons-lang3-3.1.jar 20200901 对应的maven依赖<!--sm3,sm4加密算法--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.66</version></dependency> import org.bouncycastle.crypto.digests.SM3Digest;import org.bouncycastle.crypto.macs.HMac;import org.bouncycastle.crypto.params.KeyParameter;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;import java.io.UnsupportedEncodingException;import java.security.Security;import java.util.Arrays;/*** sm3加密算法⼯具类* @explain 加密与加密结果验证(不可逆算法)* @author Marydon* @creationTime 2018年7⽉5⽇上午10:01:24* @version 1.0* @since*@*****************************/public class Sm3Utils {private static final String ENCODING = "UTF-8";static {Security.addProvider(new BouncyCastleProvider());}} 2.SM3加密 ⽅式⼀:不提供密钥/*** sm3算法加密* @explain* @param paramStr* 待加密字符串* @return 返回加密后,固定长度=32的16进制字符串*/public static String encrypt(String paramStr){// 将返回的hash值转换成16进制字符串String resultHexString = "";try {// 将字符串转换成byte数组byte[] srcData = paramStr.getBytes(ENCODING);// 调⽤hash()byte[] resultHash = hash(srcData);// 将返回的hash值转换成16进制字符串resultHexString = ByteUtils.toHexString(resultHash);} catch (UnsupportedEncodingException e) {e.printStackTrace();}return resultHexString;}/*** 返回长度=32的byte数组* @explain ⽣成对应的hash值* @param srcData* @return*/public static byte[] hash(byte[] srcData) {SM3Digest digest = new SM3Digest();digest.update(srcData, 0, srcData.length);byte[] hash = new byte[digest.getDigestSize()];digest.doFinal(hash, 0);return hash;} ⽅式⼆:⾃定义密钥/*** 通过密钥进⾏加密* @explain 指定密钥进⾏加密* @param key* 密钥* @param srcData* 被加密的byte数组* @return*/public static byte[] hmac(byte[] key, byte[] srcData) {KeyParameter keyParameter = new KeyParameter(key);SM3Digest digest = new SM3Digest();HMac mac = new HMac(digest);mac.init(keyParameter);mac.update(srcData, 0, srcData.length);byte[] result = new byte[mac.getMacSize()];mac.doFinal(result, 0);return result;} 3.加密数据校验/*** 判断源数据与加密数据是否⼀致* @explain 通过验证原数组和⽣成的hash数组是否为同⼀数组,验证2者是否为同⼀数据 * @param srcStr* 原字符串* @param sm3HexString* 16进制字符串* @return 校验结果*/public static boolean verify(String srcStr, String sm3HexString) {boolean flag = false;try {byte[] srcData = srcStr.getBytes(ENCODING);byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);byte[] newHash = hash(srcData);if (Arrays.equals(newHash, sm3Hash))flag = true;} catch (UnsupportedEncodingException e) {e.printStackTrace();}return flag;} 4.测试。
java的3DES加密

java的3DES加密package mai.util;import java.security.Security;importjavax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class ThreeDES{private ic final Sing Algorithm = \"DESe\"; //定义加密算法,可用 DES,DESede,Blowfish //keybyte为加密密钥,长度为24字节 //src为被加密的数据缓冲区(源) public static byte[] eryptMode(byte[] keybyte, byte[] src) { try{ //生成密钥 SecretKey deskey = newSecretKeySpec(keybyte, Algorithm); //加密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.ENCRYPT_MODE, deskey); return c1.doFinal(src); } ch(java.security.NoSuchAlgorithmException e1){ e1.printStackTrace(); } catch (javax.crypto.NoSuchPaingException e2){ e2.printStackTrace(); } catch (ng.Exception e3) { e3.printStackTrace(); } return null; } //keybyte为加密密钥,长度为24字节 //src为加密后的缓冲区 public static byte[] decryptMode(byte[] keybyte, byte[] src) { try { //生成密钥 SecretKey deskey = newSecretKeySpec(keybyte, Algorithm); //解密 Cipher c1 = Cipher.getInstance(Algorithm); c1.init(Cipher.DECRYPT_MODE, deskey); return c1.doFinal(src); } catch(java.security.NoSuchAlgorithmException e1){ e1.printStackTrace(); } catch(javax.crypto.NoSuchPaddingException e2){ e2.printStackTrace(); } catch (ng.Exception e3) { e3.printStackTrace(); } return null; } //转换成十六第1页共2页。
aes.encrypt 方法的参数

在Java中,`AES.encrypt`方法通常需要两个参数:1. 第一个参数是明文数据(plaintext),即你想要加密的原始数据。
这个参数通常是一个字符串或者字节数组。
2. 第二个参数是加密密钥(encryption key),用于对数据进行加密。
这个参数通常是一个字符串或者字节数组。
以下是一个使用AES加密的简单示例:```javaimport javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.nio.charset.StandardCharsets;import java.util.Base64;public class Main {public static void main(String[] args) throws Exception {// 明文String plaintext = "Hello, World!";// 密钥,16位String key = "1234567890123456";Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));String encryptedString = Base64.getEncoder().encodeToString(encrypted);System.out.println(encryptedString);}}```在这个例子中,我们使用AES算法、ECB模式和PKCS5Padding 填充方式创建了一个Cipher实例。
java 标准的md5
java 标准的md5Java标准的MD5。
在Java编程中,MD5(Message Digest Algorithm 5)是一种广泛使用的加密算法,用于对数据进行加密和摘要处理。
MD5算法产生的摘要长度为128位,通常以32位十六进制数表示,它是一种不可逆的加密算法,即无法通过MD5摘要逆向推导出原始数据。
在本文中,我们将详细介绍Java标准的MD5算法的使用方法和相关注意事项。
首先,我们需要了解如何在Java中使用MD5算法对数据进行加密。
Java标准库中提供了java.security.MessageDigest类来实现MD5算法。
下面是一个简单的示例代码:```java。
import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Example {。
public static void main(String[] args) {。
String input = "Hello, MD5!";try {。
MessageDigest md = MessageDigest.getInstance("MD5");md.update(input.getBytes());byte[] digest = md.digest();StringBuffer sb = new StringBuffer();for (byte b : digest) {。
sb.append(String.format("%02x", b & 0xff));}。
System.out.println("MD5 hash: " + sb.toString());} catch (NoSuchAlgorithmException e) {。
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。
Java实现Base64位加密
Java实现Base64位加密⼀密码常⽤术语 明⽂:待加密信息 密⽂:经过加密后的明⽂ 加密:明⽂转为密⽂的过程 加密算法:明⽂转为密⽂的转换算法 加密秘钥:通过加密算法进⾏加密操作的秘钥 解密:将密⽂转为明⽂的过程 解密算法:密⽂转为明⽂的算法 解密秘钥:通过解密算法进⾏解密操作的秘钥 密码分析:截获密⽂者试图通过分析截获的密⽂从⽽推断出原来的明⽂或秘钥的过程 主动攻击:攻击者⾮法⼊侵密码系统,采⽤伪造,修改,删除等⼿段向系统注⼊假消息进⾏欺骗(对密⽂具有破坏作⽤) 被动攻击:对⼀个保密系统采取截获密⽂并对其进⾏分析和攻击(对密⽂没有破坏作⽤) 密码体制:由明⽂空间,密⽂空间,秘钥空间,加密算法和解密算法五部分组成 密码协议:也称为安全协议,指以密码学为基础的消息交换的通信协议,⽬的是在⽹络环境中提供安全的服务 柯克霍夫原则:数据的安全基于秘钥⽽不是算法的保密,即系统的安全取决于秘钥,对秘钥保密,对算法公开.___现代密码学设计的基本原则⼆密码分类密码分类----时间 古典密码:以字符为基本加密单元 现代密码:以信息块为基本加密单元密码分类----保密内容算法名称详细说明应⽤领域类别受限制算法算法的保密性基于保持算法的秘密军事领域古典密码基于秘钥算法算法的保密性基于对秘钥的保密现代密码密码分类----密码体制名称别名详细说明对称密码单钥密码或私钥密码指加密秘钥与解密秘钥相同⾮对称密码双钥密码或公钥密码加密秘钥与解密秘钥不同,秘钥份公钥,私钥对称密码算法单钥密码算法或私钥密码算法指应⽤于对称密码的加密,解密算法⾮对称密码算法双钥密码算法或公钥密码算法指对应于⾮对称密码的加密,解密算法密码分类----明⽂处理⽅法 分组密码:指加密时将明⽂分成固定长度的组,⽤同⼀秘钥和算法对每⼀块加密,输出也是固定从长度的密⽂,多⽤于⽹络加密 流密码:也称序列密码.指加密时每次加密⼀位或者⼀个字节明⽂散列函数 散列函数⽤来验证数据的完整性 特点: 长度不受限制 哈希值容易计算 散列运算过程不可逆散列函数相关的算法 消息摘要算法MD5等 SHA--安全散列算法 MAC--消息认证码算法数字签名 主要是针对以数字的形式存储的消息进⾏的处理三 OSI与TCP/IP安全体系OSI安全体系 开放式通信系统(Open System Interconnection) 七层⽹络通信协议对应的安全机制有加密机制,数字签名机制,访问控制机制,数据完整性机制,认证机制,业务流填充机制,路由控制机制,公证机制.对应每⼀层会拥有不同的处理⽅式 安全服务 认证(鉴别):在整个⽹络的交互过程中,对于接收⽅和发送⽅的⾝份和数据来源的认证 访问控制服务:防⽌没有授权的⽤户⾮法访问资源 数据保密性服务:为了确保数据的安全有效,防⽌数据在传输过程中泄露和篡改 数据完整性服务:保证数据在传输过程中原样传输 抗否认性服务:防⽌发送和接收双⽅在执⾏各⾃操作的时候否认操作TCP/IP安全体系四实现Base64算法算法实现 -JDK -Commons Codec -Bouncy Castle代码实现:三种实现⽅式package com.dzj.test;import java.util.Base64.Encoder;import sun.misc.BASE64Decoder;import java.io.IOException;import java.util.Base64;/*** 三种⽅式实现Base64加密** @author Administrator**/public class Base64Demo {private static String src = "hello world";public static void main(String[] args) {// jdkBase64();// commonsCodesBase64();bouncyCastleBase64();}public static void jdkBase64() {Encoder encoder = Base64.getEncoder();byte[] encode = encoder.encode(src.getBytes());String encodeStr = new String(encode);System.out.println(encodeStr);BASE64Decoder decoder = new BASE64Decoder();byte[] decodeBuffer = null;try {decodeBuffer = decoder.decodeBuffer(encodeStr);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}String decodeStr = new String(decodeBuffer);System.out.println(decodeStr);}public static void commonsCodesBase64() {byte[] encodeBytes = mons.codec.binary.Base64.encodeBase64(src.getBytes()); System.out.println("encode:" + new String(encodeBytes));byte[] decodeBytes = mons.codec.binary.Base64.decodeBase64(encodeBytes); System.out.println(new String(decodeBytes));}public static void bouncyCastleBase64() {byte[] encode = org.bouncycastle.util.encoders.Base64.encode(src.getBytes());System.out.println(new String(encode));byte[] decode = org.bouncycastle.util.encoders.Base64.decode(encode);System.out.println(new String(decode));}}View Code。
S-DES加密算法的JAVA实现
周胜安(200620109286) 计算机科学与工程研一(2)班S-DES加密算法的JAVA实现一、实验要求(1)简述S-DES的加密算法的主要思想(2)实现的主要步骤,及各个步骤的主要思想及示意图(3)给出程序的分析,运行结果和程序的效率分析(4)通过编程实现S-DES加密算法,了解DES加密的原理,也加深对现代对称密码的理解。
二、算法思想•加密算法的数学表示:密文=IP-1fk2(SW(fk1(IP(明文)))))其中K1=P8(移位(P10(密钥K)))K2=P8(移位(移位(P10(密钥K))))• 解密算法的数学表示:明文=IP-1(fk1(SW(fk2(IP(密文)))))S-DES 加密方法示意图:S-DES算法涉及加密、密钥产生、解密三个部分。
流程图(每个函数的算法见源代码)三、算法流程框图、各模块说明实验是用JAVA实现的(1)密钥的产生密钥产生的示意图:密钥的产生算法涉及五个函数定义(1)初始置换P10 其中P10的定义为:P10(k1,k2,…,k10)=(k3,k5,k2,k7,k4,k10,k1,k9,k8,k6)(2)LS-1操作:对密钥的左右两组循环左移一位(密钥分成5位一组,共2组)(3)P8置换产生Key1。
其中P8的定义为:P8(k1,k2,…,k10)=(k6,k3,k7,k4,k8,k5,k10,k9)(4)LS-2操作: :对密钥的左右两组循环左移两位.(5) P8置换产生Key2(2) S-DES 的加密过程示意图:加密算法涉及五个函数:(1)初始置换IP(initial permutation)。
其中P8的定义为:IP(k1,k2,…,k8)=(k2,k6,k3,k1,k4,k8,k5,k7)(2)复合函数fk,它是由密钥K确定的,具有置换和代替的运算。
函数fk,是加密方案中的最重要部分,它可表示为:fk(L,R)=(L F(R,SK),R)其中L,R为8位输入, 左右各为4位, F为从4位集到4位集的一个映射, 并不要求是1-1的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java加密方法
Java加密方法是一种重要的数据安全技术,它可以有效的保护数据信息的隐私和安全。
在开发Java应用程序时,常常需要对敏感数据进行加密处理,例如登录密码、用户信息等。
本文将对Java加密方法的实现原理和常见的加密算法进行介绍。
一、Java加密方法的原理
Java加密方法是通过将原始明文数据通过一定的算法转换为密文数据的过程,使得外界无法轻易获取敏感信息。
一旦需要使用这些数据时,再将其进行解密,还原为原始数据。
Java加密方法主要包括对称加密和非对称加密两种方式。
⑴ 对称加密
对称加密是指加密和解密使用的密钥是相同的算法。
加密者将明文信息和一个预设的密钥进行加密处理,生成密文信息;解密者将密文和相同的密钥进行解密处理,还原出明文信息。
常见的对称加密算法有DES、3DES、AES 等。
以AES算法为例,其加密过程如下:
1.创建AES密钥生成器:SecretKeyGenerator des = SecretKeyGenerator.getInstance("AES");
2.生成密钥SecretKey secretKey =
des.generateKey();
3.对原始数据进行加密Cipher cipher =
Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encData = cipher.doFinal(originalData);
4.对加密数据进行解密
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decData = cipher.doFinal(encData);
⑵ 非对称加密
非对称加密是指使用一对不同的密钥进行加密和解密。
使用公钥加密后只能由私钥进行解密,使用私钥加密后只能由公钥进行解密。
常见的非对称加密算法有RSA、ElGamal等。
以RSA算法为例,其加密过程如下:
1.创建RSA密钥对
KeyPairGenerator kpg =
KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keyPair = kpg.genKeyPair();
2.获取RSA公钥和私钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
3.对原始数据进行加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encData = cipher.doFinal(originalData);
4.对加密数据进行解密
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decData = cipher.doFinal(encData);
二、常见的Java加密算法
1. DES算法
DES算法是一种对称加密算法,采用64位的密钥,按照固定的算法进行加密和解密。
DES算法因为密钥太短,已经被证明不是非常安全。
因此通常采用3DES算法来代替。
2. 3DES算法
3DES算法是一种对称加密算法,采用3个不同的56位密钥对数据进行三次加密操作。
与DES算法相比,3DES 算法更为安全,但也因为加密次数增加而导致速度变慢。
3. AES算法
AES算法是一种对称加密算法,采用128位、192位或256位的密钥进行加密和解密。
AES算法的加密速度较快,同时也具有较高的安全性。
4. RSA算法
RSA算法是一种非对称加密算法,采用公钥和私钥进行加密和解密。
RSA算法的安全性较高,但是加密和解密速度较慢,适合处理小数据量的加密。
三、Java加密方法的应用
Java加密方法广泛应用于网络通信、数据存储和认证授权等领域。
在网络通信方面,Java加密方法常用于对密码、用户信息和报文等进行加密处理,确保网络通信数据的安全和私密性。
在数据存储方面,Java加密方法常用于对数据库、文件和本地存储数据进行加密处理,确保数据的安全性和完整性。
在认证授权方面,Java加密方法常用于对用户身份进行验证,例如使用SHA算法对密码进行哈希处理,并对比加密后的哈希值是否一致,以此实现用户认证的功能。
总之,Java加密方法是一种非常重要的数据安全技术,应用广泛,具有重要的实用价值。
掌握Java加密方法的实现原理和常见的加密算法,对于保护网络通信数据和保障用户隐私都有着重要的意义。