利用Java程序实现加密解密问题
JAVA实现古典置换密码的加密解密
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.Arrays;public class zhihuan {public static void main(String args[]) throws IOException{System.out.println("请您输入需要的服务,1为加密,2为解密");BufferedReader br=new BufferedReader(new InputStreamReader(System.in));int Choice=Integer.parseInt(br.readLine());if(Choice==1){System.out.println("您进入了加密程序");System.out.print("请输入您需要加密的明文:");String MingWen=br.readLine();System.out.print("请输入加密秘钥:");String key=br.readLine();jiami(MingWen,key);Choice=2;}if(Choice==2){System.out.println("您进入了解密程序");System.out.print("请输入您需要解密的密文:");String MiWen=br.readLine();System.out.print("请输入解密秘钥:");String key2=br.readLine();jiemi(MiWen,key2);System.exit(0);}else{System.out.println("输入错误,请重新输入,1为加密,2为解密:\n");System.exit(0);}}static void jiami(String mingwen,String key){int hang=(int)Math.ceil((double)mingwen.length()/(double)key.length());//行数int lie=key.length();//列数char[][] juzhen=new char[hang][lie];//定义矩阵存储明文int temp=0;for(int i=0;i<hang;i++)//嵌套循环将明文存入矩阵{for(int j=0;j<lie;j++){if(temp<mingwen.length()){juzhen[i][j]=mingwen.charAt(temp);temp++;}}}int[] key_xu=new int[key.length()];//此数组存储秘钥字母顺序for(int i=0;i<key.length();i++)//将秘钥转ASCII码{key_xu[i]=(int)key.charAt(i);}Arrays.sort(key_xu); //对秘钥ASCII码进行排序int[] a=new int[key.length()];//此数组用于记录转换映射for(int i=0;i<key.length();i++)//利用嵌套循环在数组a中记录转换映射关系for(int j=0;j<key.length();j++){if( (int)key.charAt(i)==key_xu[j]){a[i]=j;}}char[][] mima=new char[hang][lie];//定义第一次转置后的密码矩阵for(int j=0;j<lie;j++)//开始第一次转置for(int i=0;i<hang;i++){mima[i][j]=juzhen[i][a[j]];}System.out.print("加密后密码:");for(int j=0;j<lie;j++)//第二次转置输出结果{for(int i=0;i<hang;i++){System.out.print(mima[i][a[j]]);}}}static void jiemi(String miwen,String key){int hang=(int)Math.ceil((double)miwen.length()/(double)key.length());//int lie=key.length();//char[][] juzhen=new char[hang][lie];int temp=0;for(int j=0;j<lie;j++)//嵌套循环将明文存入矩阵{for(int i=0;i<hang;i++){if(temp<miwen.length()){juzhen[i][j]=miwen.charAt(temp);temp++;}}}int[] key_xu=new int[key.length()];//此数组存储秘钥字母顺序for(int i=0;i<key.length();i++)//将秘钥转ASCII码{key_xu[i]=(int)key.charAt(i);}Arrays.sort(key_xu); //对秘钥ASCII码进行排序int[] a=new int[key.length()];//此数组用于记录转换映射for(int i=0;i<key.length();i++)//利用嵌套循环在数组a中记录转换映射关系for(int j=0;j<key.length();j++){if( (int)key.charAt(i)==key_xu[j]){a[i]=j;}}char[][] ming=new char[hang][lie];//定义第一次转置后的密码矩阵for(int j=0;j<lie;j++)//开始第一次转置for(int i=0;i<hang;i++){ming[i][a[j]]=juzhen[i][j];}char[][] mingwen=new char[hang][lie];for(int j=0;j<lie;j++)//开始第2次转置for(int i=0;i<hang;i++){mingwen[i][a[j]]=ming[i][j];}System.out.println("解密结果为:");for(int i=0;i<hang;i++){for(int j=0;j<lie;j++){System.out.print(mingwen[i][j]);}}}}。
java 密码加密解密方法
java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。
其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。
一种常见的密码加密方法是使用MessageDigest类进行加密。
这可以通过以下步骤实现:首先,将密码转换为字节数组。
然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。
接下来,使用update方法将密码的字节数组传递给MessageDigest实例。
最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。
另一种常见的方法是使用对称加密算法,例如AES或DES。
这些算法使用相同的密钥进行加密和解密。
在Java中,可以使用javax.crypto包中的类来实现对称加密。
通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。
此外,还可以使用非对称加密算法,例如RSA。
这种方法使用公钥对数据进行加密,然后使用私钥进行解密。
在Java中,可以使用java.security包中的类来实现非对称加密。
无论使用哪种方法,都需要注意密码安全的问题。
例如,密钥的安全存储和管理,以及密码传输过程中的安全性。
另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。
总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。
希望这些信息能够帮助你更好地理解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实现安全性加密与解密
使用Java实现安全性加密与解密在当今信息时代,数据的安全性越来越受到重视。
无论是个人的隐私信息还是企业的商业机密,都需要得到有效的保护。
而加密与解密技术就是一种常用的保护数据安全的手段。
本文将介绍如何使用Java语言实现安全性加密与解密。
1. 加密与解密的基本概念加密是将明文转换为密文的过程,而解密则是将密文转换回明文的过程。
加密算法通常使用一个密钥,密钥用于控制加密过程的转换规则,只有拥有正确的密钥才能进行解密。
常见的加密算法有对称加密算法和非对称加密算法。
对称加密算法使用相同的密钥进行加密和解密,速度较快,但密钥的传输和管理相对困难。
非对称加密算法使用一对密钥,公钥用于加密,私钥用于解密,安全性较高,但速度较慢。
2. 使用Java实现对称加密Java提供了多种对称加密算法的实现,如DES、AES等。
下面以AES算法为例,介绍如何使用Java实现对称加密。
首先,需要导入Java加密扩展(JCE)的包。
在Java 8及以上版本中,JCE已经被默认包含在JDK中,无需额外导入。
接下来,可以使用以下代码进行AES加密:```javaimport javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESUtil {private static final String ALGORITHM = "AES";public static String encrypt(String plainText, String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String encryptedText, String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}}```以上代码中,`encrypt`方法用于对明文进行加密,`decrypt`方法用于对密文进行解密。
JAVA实现AES的加密和解密算法
JAVA实现AES的加密和解密算法AES(高级加密标准)是一种对称加密算法,可以通过Java的javax.crypto库来实现。
下面我们将介绍一种基于Java的AES加密和解密算法的实现方法。
1.导入所需的包在Java中使用AES加密和解密算法需要导入以下两个包:```import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;```2.创建加密和解密函数首先,我们需要创建加密函数和解密函数。
加密函数将输入的明文数据加密为密文,解密函数将输入的密文数据解密为明文。
```javaprivate static byte[] encrypt(byte[] key, byte[] data) throws ExceptionSecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);return cipher.doFinal(data);private static byte[] decrypt(byte[] key, byte[] encryptedData) throws ExceptionSecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);return cipher.doFinal(encryptedData);```3.测试加密和解密函数为了验证加密和解密函数的正确性,我们可以创建一个测试函数来测试它们。
java 加密解密简单实现
java 加密解密简单实现加密算法有很多种:这里只大约列举几例:1:消息摘要:(数字指纹):既对一个任意长度的一个数据块进行计算,产生一个唯一指纹。
MD5/SHA1发送给其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后进行比较摘要是否相同。
2:单匙密码体制:DES:比较简便高效,密钥简短,加解密速度快,破译极其困难,但其安全性依赖于密匙的安全性。
DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。
DES算法的入口参数有三个:Key、Data、Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密3:数字签名:就是信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在经签名后末被篡改(即完整性)。
当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
代表:DSA4:非对称密匙密码体制(公匙体系):加密密匙不同于解密密匙,加密密匙公之于众,谁都可以使用,解密密匙只有解密人自己知道。
代表:RSA下面是对上面几个例子进行的简单实现:Java代码1.package test;2.import java.io.FileInputStream;3.import java.io.FileOutputStream;4.import java.io.IOException;5.import java.io.ObjectInputStream;6.import java.io.ObjectOutputStream;7.import java.security.*;8.import javax.crypto.Cipher;9.import javax.crypto.KeyGenerator;10.import javax.crypto.SecretKey;11./**12. * 加密解密13. *14. * @author shy.qiu15. * @since /qiushyfm16. */17.public class CryptTest {18. /**19. * 进行MD5加密20. *21. * @param info22. * 要加密的信息23. * @return String 加密后的字符串24. */25. public String encryptToMD5(String info) {26. byte[] digesta = null;27. try {28. // 得到一个md5的消息摘要29. MessageDigest alga = MessageDigest.getInstance("MD5");30. // 添加要进行计算摘要的信息31. alga.update(info.getBytes());32. // 得到该摘要33. digesta = alga.digest();34. } catch (NoSuchAlgorithmException e) {35. e.printStackTrace();36. }37. // 将摘要转为字符串38. String rs = byte2hex(digesta);39. return rs;40. }41. /**42. * 进行SHA加密43. *44. * @param info45. * 要加密的信息46. * @return String 加密后的字符串47. */48. public String encryptToSHA(String info) {49. byte[] digesta = null;50. try {51. // 得到一个SHA-1的消息摘要52. MessageDigest alga = MessageDigest.getInstance("SHA-1");53. // 添加要进行计算摘要的信息54. alga.update(info.getBytes());55. // 得到该摘要56. digesta = alga.digest();57. } catch (NoSuchAlgorithmException e) {58. e.printStackTrace();59. }60. // 将摘要转为字符串61. String rs = byte2hex(digesta);62. return rs;63. }64. // //////////////////////////////////////////////////////////////////////////65. /**66. * 创建密匙67. *68. * @param algorithm69. * 加密算法,可用 DES,DESede,Blowfish70. * @return SecretKey 秘密(对称)密钥71. */72. public SecretKey createSecretKey(String algorithm) {73. // 声明KeyGenerator对象74. KeyGenerator keygen;75. // 声明密钥对象76. SecretKey deskey = null;77. try {78. // 返回生成指定算法的秘密密钥的 KeyGenerator 对象79. keygen = KeyGenerator.getInstance(algorithm);80. // 生成一个密钥81. deskey = keygen.generateKey();82. } catch (NoSuchAlgorithmException e) {83. e.printStackTrace();84. }85. // 返回密匙86. return deskey;87. }88. /**89. * 根据密匙进行DES加密90. *91. * @param key92. * 密匙93. * @param info94. * 要加密的信息95. * @return String 加密后的信息96. */97. public String encryptToDES(SecretKey key, String info) {98. // 定义加密算法,可用 DES,DESede,Blowfish99. String Algorithm = "DES";100. // 加密随机数生成器 (RNG),(可以不写)101. SecureRandom sr = new SecureRandom();102. // 定义要生成的密文103. byte[] cipherByte = null;104. try {105. // 得到加密/解密器106. Cipher c1 = Cipher.getInstance(Algorithm); 107. // 用指定的密钥和模式初始化Cipher对象108. // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE) 109. c1.init(Cipher.ENCRYPT_MODE, key, sr); 110. // 对要加密的内容进行编码处理,111. cipherByte = c1.doFinal(info.getBytes()); 112. } catch (Exception e) {113. e.printStackTrace();114. }115. // 返回密文的十六进制形式116. return byte2hex(cipherByte);117. }118. /**119. * 根据密匙进行DES解密120. *121. * @param key122. * 密匙123. * @param sInfo124. * 要解密的密文125. * @return String 返回解密后信息126. */127. public String decryptByDES(SecretKey key, String sInfo ) {128. // 定义加密算法,129. String Algorithm = "DES";130. // 加密随机数生成器 (RNG)131. SecureRandom sr = new SecureRandom();132. byte[] cipherByte = null;133. try {134. // 得到加密/解密器135. Cipher c1 = Cipher.getInstance(Algorithm); 136. // 用指定的密钥和模式初始化Cipher对象137. c1.init(Cipher.DECRYPT_MODE, key, sr); 138. // 对要解密的内容进行编码处理139. cipherByte = c1.doFinal(hex2byte(sInfo)); 140. } catch (Exception e) {141. e.printStackTrace();142. }143. // return byte2hex(cipherByte);144. return new String(cipherByte);145. }146. // /////////////////////////////////////////////////// //////////////////////////147. /**148. * 创建密匙组,并将公匙,私匙放入到指定文件中149. *150. * 默认放入mykeys.bat文件中151. */152. public void createPairKey() {153. try {154. // 根据特定的算法一个密钥对生成器155. KeyPairGenerator keygen = KeyPairGenerator.get Instance("DSA");156. // 加密随机数生成器 (RNG)157. SecureRandom random = new SecureRandom(); 158. // 重新设置此随机对象的种子159. random.setSeed(1000);160. // 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器161. keygen.initialize(512, random);// keygen.initi alize(512);162. // 生成密钥组163. KeyPair keys = keygen.generateKeyPair(); 164. // 得到公匙165. PublicKey pubkey = keys.getPublic();166. // 得到私匙167. PrivateKey prikey = keys.getPrivate(); 168. // 将公匙私匙写入到文件当中169. doObjToFile("mykeys.bat", new Object[] { prike y, pubkey });170. } catch (NoSuchAlgorithmException e) {171. e.printStackTrace();172. }173. }174. /**175. * 利用私匙对信息进行签名把签名后的信息放入到指定的文件中176. *177. * @param info178. * 要签名的信息179. * @param signfile180. * 存入的文件181. */182. public void signToInfo(String info, String signfile) {183. // 从文件当中读取私匙184. PrivateKey myprikey = (PrivateKey) getObjFromFile( "mykeys.bat", 1);185. // 从文件中读取公匙186. PublicKey mypubkey = (PublicKey) getObjFromFile("m ykeys.bat", 2);187. try {188. // Signature 对象可用来生成和验证数字签名189. Signature signet = Signature.getInstance("DSA");190. // 初始化签署签名的私钥191. signet.initSign(myprikey);192. // 更新要由字节签名或验证的数据193. signet.update(info.getBytes());194. // 签署或验证所有更新字节的签名,返回签名195. byte[] signed = signet.sign();196. // 将数字签名,公匙,信息放入文件中197. doObjToFile(signfile, new Object[] { signed, m ypubkey, info });198. } catch (Exception e) {199. e.printStackTrace();200. }201. }202. /**203. * 读取数字签名文件根据公匙,签名,信息验证信息的合法性204. *205. * @return true 验证成功 false 验证失败206. */207. public boolean validateSign(String signfile) { 208. // 读取公匙209. PublicKey mypubkey = (PublicKey) getObjFromFile(si gnfile, 2);210. // 读取签名211. byte[] signed = (byte[]) getObjFromFile(signfile,1);212. // 读取信息213. String info = (String) getObjFromFile(signfile, 3) ;214. try {215. // 初始一个Signature对象,并用公钥和签名进行验证216. Signature signetcheck = Signature.getInstance( "DSA");217. // 初始化验证签名的公钥218. signetcheck.initVerify(mypubkey);219. // 使用指定的 byte 数组更新要签名或验证的数据220. signetcheck.update(info.getBytes());221. System.out.println(info);222. // 验证传入的签名223. return signetcheck.verify(signed);224. } catch (Exception e) {225. e.printStackTrace();226. return false;227. }228. }229. /**230. * 将二进制转化为16进制字符串231. *232. * @param b233. * 二进制字节数组234. * @return String235. */236. public String byte2hex(byte[] b) {237. String hs = "";238. String stmp = "";239. for (int n = 0; n < b.length; n++) {240. stmp = (ng.Integer.toHexString(b[n] & 0 XFF));241. if (stmp.length() == 1) {242. hs = hs + "0" + stmp;243. } else {244. hs = hs + stmp;245. }246. }247. return hs.toUpperCase();248. }249. /**250. * 十六进制字符串转化为2进制251. *252. * @param hex253. * @return254. */255. public byte[] hex2byte(String hex) {256. byte[] ret = new byte[8];257. byte[] tmp = hex.getBytes();258. for (int i = 0; i < 8; i++) {259. ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1] );260. }261. return ret;262. }263. /**264. * 将两个ASCII字符合成一个字节;如:"EF"--> 0xEF 265. *266. * @param src0267. * byte268. * @param src1269. * byte270. * @return byte271. */272. public static byte uniteBytes(byte src0, byte src1) {273. byte _b0 = Byte.decode("0x" + new String(new byte[ ] { src0 }))274. .byteValue();275. _b0 = (byte) (_b0 << 4);276. byte _b1 = Byte.decode("0x" + new String(new byte[ ] { src1 }))277. .byteValue();278. byte ret = (byte) (_b0 ^ _b1);279. return ret;280. }281. /**282. * 将指定的对象写入指定的文件283. *284. * @param file285. * 指定写入的文件286. * @param objs287. * 要写入的对象288. */289. public void doObjToFile(String file, Object[] objs) {290. ObjectOutputStream oos = null;291. try {292. FileOutputStream fos = new FileOutputStream(fi le);293. oos = new ObjectOutputStream(fos);294. for (int i = 0; i < objs.length; i++) { 295. oos.writeObject(objs[i]);296. }297. } catch (Exception e) {298. e.printStackTrace();299. } finally {300. try {301. oos.close();302. } catch (IOException e) {303. e.printStackTrace();304. }305. }306. }307. /**308. * 返回在文件中指定位置的对象309. *310. * @param file311. * 指定的文件312. * @param i313. * 从1开始314. * @return315. */316. public Object getObjFromFile(String file, int i) { 317. ObjectInputStream ois = null;318. Object obj = null;319. try {320. FileInputStream fis = new FileInputStream(file );321. ois = new ObjectInputStream(fis);322. for (int j = 0; j < i; j++) {323. obj = ois.readObject();324. }325. } catch (Exception e) {326. e.printStackTrace();327. } finally {328. try {329. ois.close();330. } catch (IOException e) {331. e.printStackTrace();332. }333. }334. return obj;335. }336. /**337. * 测试338. *339. * @param args340. */341. public static void main(String[] args) {342. CryptTest jiami = new CryptTest();343. // 执行MD5加密"Hello world!"344. System.out.println("Hello经过MD5:" + jiami.encryptToMD5("Hello"));345. // 生成一个DES算法的密匙346. SecretKey key = jiami.createSecretKey("DES"); 347. // 用密匙加密信息"Hello world!"348. String str1 = jiami.encryptToDES(key, "Hello"); 349. System.out.println("使用des加密信息Hello 为:" + str1);350. // 使用这个密匙解密351. String str2 = jiami.decryptByDES(key, str1); 352. System.out.println("解密后为:" + str2);353. // 创建公匙和私匙354. jiami.createPairKey();355. // 对Hello world!使用私匙进行签名356. jiami.signToInfo("Hello", "mysign.bat");357. // 利用公匙对签名进行验证。
java中sha256加解密方法
java中sha256加解密方法SHA256是一种常用的加密算法,它可以对数据进行加密和解密操作。
在Java中,我们可以使用Java的安全库提供的功能来实现SHA256的加解密。
我们需要导入Java的安全库,这可以通过在代码中添加以下语句来实现:```import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;```接下来,我们需要定义一个方法来实现SHA256的加密功能,可以命名为sha256Encrypt。
该方法接受一个字符串作为参数,并返回一个加密后的字符串。
具体代码如下:```public static String sha256Encrypt(String input) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(input.getBytes("UTF-8"));StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {e.printStackTrace();}return null;}```在这个方法中,我们首先通过调用MessageDigest.getInstance("SHA-256")来获取SHA-256算法的实例。
java国密加密与解密流程
java国密加密与解密流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 引入国密相关的依赖库在 Java 项目中,需要引入国密相关的依赖库,例如 Bouncy Castle 库。
JAVA使用DES加密算法加密解密
JAVA使⽤DES加密算法加密解密程序中使⽤了.properties⽂件作为参数配置⽂档,好处是灵活配置各项参数⼀旦对数据库的⼀些参数进⾏了配置,势必涉及数据库的IP,端⼝,⽤户名和密码properties⽂件全是unicode编码明⽂存储,程序打包交付后,其他⼈能够很容易使⽤解压软件打开jar查看你的.properties⽂件所以⼀些敏感变量需要加密处理⾸先需要了解⼀些基本的加密算法,⽐如MD5,⽐如DES和RSAMD5是⼀种不可逆的加密算法,使⽤散列后特征码的⽅式表现需要加密的字符或者⽂件,常⽤在系统登陆的密码⽐对中将MD5码存储在数据库中,⽤户登陆时将⽤户输⼊的字符散列成MD5后于数据库中的密⽂进⾏⽐对不可逆的加密算法有⼀种好处就是,即使后台数据库被攻破了,对⽅拿这些MD5散列密⽂也毫⽆办法求得明⽂DES和RSA都是可逆的加密算法,也就是可以通过密钥和密⽂解开得到明⽂,其中最常见的64位轮转DES算法在JAVA的JDK中提供了先天性的良好的加密⽀持,其中就包括⼤名⿍⿍的DES下⾯⼀个DESHelper类展⽰了如何将密⽂解开得到明⽂的⽅法package com.newflypig.des;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import sun.misc.BASE64Decoder;/*** 处理数据库密码的密⽂转明⽂类* @author newflypig* time:2015年10⽉30⽇* TODO**/public class DESHelper {/*** Description 根据键值进⾏解密* @param data* @param key 加密键byte数组* @return* @throws Exception*/private static byte[] decrypt(byte[] data, byte[] key) throws Exception {// ⽣成⼀个可信任的随机数源SecureRandom sr = new SecureRandom();// 从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建⼀个密钥⼯⼚,然后⽤它把DESKeySpec转换成SecretKey对象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");SecretKey securekey = keyFactory.generateSecret(dks);// Cipher对象实际完成解密操作Cipher cipher = Cipher.getInstance("DES");// ⽤密钥初始化Cipher对象cipher.init(Cipher.DECRYPT_MODE, securekey, sr);return cipher.doFinal(data);}public static String decrypt(String data, String key) throws Exception {if (data == null)return null;BASE64Decoder decoder = new BASE64Decoder();byte[] buf = decoder.decodeBuffer(data);byte[] bt = decrypt(buf, key.getBytes());return new String(bt);}}如需对加密算法有更深刻的了解,可以⾃⾏研究实现原理,对于敏捷开发这⾥只需要不求甚解的运⽤就⾏了,记得保护好你的key也就是密钥⼀开始提到的需要将properties⽂件中的参数解开得到明⽂,想必你应该已经知道该使⽤哪种加密算法了吧对了,就是上⾯的DES加密算法,这⾥只提供了解密,因为不需要在程序中提供加密函数各位可以⾃⼰编写⾃⼰的加密函数,或者可以在⾃⼰的JUnit测试⾥⾯写加密的语句⽤来对数据库密码进⾏加密。
java 实现浮点数字加密 和 减密的方法
java 实现浮点数字加密和减密的方法文章标题:深入探讨Java实现浮点数字加密和解密的方法一、引言在现代信息时代,数据加密和解密变得越来越重要。
而对于浮点数数据的加密和解密,尤为关键。
本文将从Java语言的角度,探讨如何实现对浮点数进行加密和解密的方法。
二、浮点数字加密的实现方法1. 对浮点数进行位运算在Java中,可以通过位运算的方式对浮点数进行加密。
通过对浮点数的二进制表示进行位运算,可以实现加密的目的。
可以使用异或操作对浮点数的二进制位进行加密,从而保护数据的安全性。
2. 使用加密算法对浮点数进行处理Java中提供了丰富的加密算法库,可以通过这些算法对浮点数进行加密处理。
可以使用MD5、SHA等哈希算法对浮点数进行加密,实现数据的安全存储和传输。
3. 自定义加密算法除了使用Java已有的加密算法外,也可以自定义加密算法对浮点数进行加密。
通过与他人不可知的复杂算法,可以更好地保护浮点数数据的安全性。
三、浮点数字解密的实现方法1. 逆向位运算对于使用位运算进行浮点数加密的情况,可以通过进行逆向位运算的方式进行解密。
通过与加密时相反的位运算,可以还原出原始的浮点数数据。
2. 使用解密算法对浮点数进行处理与加密算法类似,Java中同样提供了丰富的解密算法库。
可以通过这些算法对加密过的浮点数进行解密,获取原始数据。
3. 自定义解密算法倘若使用了自定义的加密算法,那么也需要相应的自定义解密算法。
通过对加密过的浮点数数据进行逆向运算,可以实现解密的目的。
四、个人观点和理解在实际项目中,对浮点数进行加密和解密是一项非常重要的任务。
通过对浮点数数据进行加密,可以有效地保护数据的安全性,防止数据被未经授权的访问。
合理的加密和解密算法的选择,也是保证系统数据安全的重要一环。
总结与回顾通过本文的介绍,我们了解到了Java实现浮点数加密和解密的方法。
无论是通过位运算、使用加密算法,还是自定义加密算法,都可以实现对浮点数数据的安全处理。
java实现维吉尼亚加密解密算法
java实现维吉尼亚加密解密算法加密算法程序:public class mtoc{//输⼊明⽂和密钥,⽤输⼊的密钥对明⽂进⾏加密public static void main(String[] args){int i;char[] c=new char[100];char[] k1=new char[100];//输⼊System.out.print("enter a mingwen string:");String m=MyInput.readString();System.out.print("enter a key string:");String k=MyInput.readString();//构造密钥对照表for(i=0;i<k.length();i++){if(k.charAt(i)>='a'&&k.charAt(i)<='z')k1[i]=(char)(k.charAt(i)-97);if(k.charAt(i)>='A'&&k.charAt(i)<='Z')k1[i]=(char)(k.charAt(i)-65);}//加密for(i=0;i<m.length();i++){if(m.charAt(i)>='a'&&m.charAt(i)<='z')c[i]=(char)((m.charAt(i)-97+k1[i%k.length()])%26+97);if(m.charAt(i)>='A'&&m.charAt(i)<='Z')c[i]=(char)((m.charAt(i)-65+k1[i%k.length()])%26+65);}//输出密⽂for(i=0;i<c.length;i++)System.out.print(c[i]);}}解密算法程序:public class ctom{//输⼊密⽂和密钥,⽤密钥对密⽂解密public static void main(String[] args){int i;char[] m=new char[100];char[] k1=new char[100];//输⼊System.out.print("enter the miwen string:");String c=MyInput.readString();System.out.print("enter the key string:");String k=MyInput.readString();//构造密钥对照表for(i=0;i<k.length();i++){if(k.charAt(i)>='a'&&k.charAt(i)<='z')k1[i]=(char)(k.charAt(i)-97);if(k.charAt(i)>='A'&&k.charAt(i)<='Z')k1[i]=(char)(k.charAt(i)-65);}//解密for(i=0;i<c.length();i++){if(c.charAt(i)>='a'&&c.charAt(i)<='z')m[i]=(char)((c.charAt(i)-97-k1[i%k.length()]+26)%26+97);if(c.charAt(i)>='A'&&c.charAt(i)<='Z')m[i]=(char)((c.charAt(i)-65-k1[i%k.length()]+26)%26+65);}//输出明⽂for(i=0;i<m.length;i++)System.out.print(m[i]);}}需要⽤到的MyInput.java类:// MyInput.java: Contain the methods for reading int, double, and// string values from the keyboardimport java.io.*;public class MyInput{// Read a string from the keyboardpublic static String readString(){BufferedReader br= new BufferedReader(new InputStreamReader(System.in), 1);// Declare and initialize the stringString string = "";// Get the string from the keyboardtry{string = br.readLine();}catch (IOException ex){System.out.println(ex);}// Return the string obtained from the keyboardreturn string;}// Read an int value from the keyboardpublic static int readInt(){return Integer.parseInt(readString());}// Read a double value from the keyboardpublic static double readDouble(){return Double.parseDouble(readString());}// Read a byte value from the keyboardpublic static byte readByte(){return Byte.parseByte(readString());}// Read a short value from the keyboardpublic static short readShort(){return Short.parseShort(readString());}// Read a long value from the keyboardpublic static long readLong(){return Long.parseLong(readString());}// Read a float value from the keyboardpublic static float readFloat(){return Float.parseFloat(readString());}}加密算法程序:public class mtoc{//输⼊明⽂和密钥,⽤输⼊的密钥对明⽂进⾏加密public static void main(String[] args){int i;char[] c=new char[100];char[] k1=new char[100];//输⼊System.out.print("enter a mingwen string:");String m=MyInput.readString();System.out.print("enter a key string:");String k=MyInput.readString();//构造密钥对照表for(i=0;i<k.length();i++){if(k.charAt(i)>='a'&&k.charAt(i)<='z')k1[i]=(char)(k.charAt(i)-97);if(k.charAt(i)>='A'&&k.charAt(i)<='Z')k1[i]=(char)(k.charAt(i)-65);}//加密for(i=0;i<m.length();i++){if(m.charAt(i)>='a'&&m.charAt(i)<='z')c[i]=(char)((m.charAt(i)-97+k1[i%k.length()])%26+97);if(m.charAt(i)>='A'&&m.charAt(i)<='Z')c[i]=(char)((m.charAt(i)-65+k1[i%k.length()])%26+65);}//输出密⽂for(i=0;i<c.length;i++)System.out.print(c[i]);}}解密算法程序:public class ctom{//输⼊密⽂和密钥,⽤密钥对密⽂解密public static void main(String[] args){int i;char[] m=new char[100];char[] k1=new char[100];//输⼊System.out.print("enter the miwen string:");String c=MyInput.readString();System.out.print("enter the key string:");String k=MyInput.readString();//构造密钥对照表for(i=0;i<k.length();i++){if(k.charAt(i)>='a'&&k.charAt(i)<='z')k1[i]=(char)(k.charAt(i)-97);if(k.charAt(i)>='A'&&k.charAt(i)<='Z')k1[i]=(char)(k.charAt(i)-65);}//解密for(i=0;i<c.length();i++){if(c.charAt(i)>='a'&&c.charAt(i)<='z')m[i]=(char)((c.charAt(i)-97-k1[i%k.length()]+26)%26+97);if(c.charAt(i)>='A'&&c.charAt(i)<='Z')m[i]=(char)((c.charAt(i)-65-k1[i%k.length()]+26)%26+65);}//输出明⽂for(i=0;i<m.length;i++)System.out.print(m[i]);}}需要⽤到的MyInput.java类:// MyInput.java: Contain the methods for reading int, double, and // string values from the keyboardimport java.io.*;public class MyInput{// Read a string from the keyboardpublic static String readString(){BufferedReader br= new BufferedReader(new InputStreamReader(System.in), 1);// Declare and initialize the stringString string = "";// Get the string from the keyboardtry{string = br.readLine();}catch (IOException ex){System.out.println(ex);}// Return the string obtained from the keyboardreturn string;}// Read an int value from the keyboardpublic static int readInt(){return Integer.parseInt(readString());}// Read a double value from the keyboardpublic static double readDouble(){return Double.parseDouble(readString()); }// Read a byte value from the keyboard public static byte readByte(){return Byte.parseByte(readString());}// Read a short value from the keyboard public static short readShort(){return Short.parseShort(readString());}// Read a long value from the keyboard public static long readLong(){return Long.parseLong(readString());}// Read a float value from the keyboard public static float readFloat(){return Float.parseFloat(readString());}}。
java enc解密方法
java enc解密方法在Java中,可以使用Java内置的加密和解密库来实现加密和解密操作。
以下是一个简单的示例,演示如何使用Java内置的加密和解密库进行加密和解密操作:```javaimport ;import ;import ;import ;public class EncryptionExample {public static void main(String[] args) throws Exception {// 原始字符串String original = "Hello, World!";// 加密密钥String key = "secretkey";// 加密操作Cipher cipher = ("AES/ECB/PKCS5Padding");SecretKeySpec secretKey = new SecretKeySpec((_8), "AES");(_MODE, secretKey);byte[] encrypted = ((_8));String encryptedString = ().encodeToString(encrypted);("加密后的字符串: " + encryptedString);// 解密操作(_MODE, secretKey);byte[] decrypted = (().decode(encryptedString));String decryptedString = new String(decrypted, _8);("解密后的字符串: " + decryptedString);}}```在这个示例中,我们使用AES算法进行加密和解密操作。
我们首先定义了一个原始字符串和加密密钥。
然后,我们使用Cipher类创建一个加密对象,并使用指定的算法和模式进行初始化。
Java登录密码加密解密代码
return new String(output);
}
}
if(bsh.shared.crypt ==void){
// not yet defined, so create it:
bsh.shared.crypt = new CryptUtil();
}
return hasher.hash().toString();
}
public String sha1(String value) {
Hasher hasher = Hashing.sha1().newHasher();
hasher.putString(value, Charset.forName("UTF-8"));
import mon.hash.Hashing;
public class CryptUtil {
public String md5(String value) {
Hasher hasher = Hashing.md5().newHasher();
hasher.putString(value, Charset.forName("UTF-8"));
cipher.init(Cipher.DECRYPT_MODE, skey);
output = cipher.doFinal(Base64.decodeBase64(input));
} catch (Exception e) {
System.out.println(e.toString());
return hasher.hash().toString();
}
public String base64Encode(String value) {
java接收文件加密解密方法
java接收文件加密解密方法
在Java中接收加密文件并进行解密可以通过多种方式实现。
下面我将从多个角度介绍几种常见的方法:
1. 使用对称加密算法:
可以使用Java的javax.crypto包中的类来实现对称加密算法,如AES。
首先,接收加密文件后,可以使用FileInputStream 读取文件内容,然后使用Cipher类进行解密操作,最后使用FileOutputStream将解密后的内容写入新文件。
2. 使用非对称加密算法:
如果发送方使用了公钥加密文件,接收方可以使用私钥进行解密。
可以使用Java的java.security包中的类来实现非对称加密算法,如RSA。
首先,接收加密文件后,可以使用PrivateKey类进行解密操作,最后使用FileOutputStream将解密后的内容写入新文件。
3. 使用第三方库:
除了Java自带的加密算法外,也可以使用第三方库来简化加密解密操作,例如Bouncy Castle或者Apache Commons Crypto 等。
这些库提供了更多的加密选项和更简单的API,可以更容易地实现文件的加密和解密操作。
无论使用哪种方法,都需要注意文件的安全传输和存储,以及密钥的安全管理。
另外,要确保在解密文件时处理可能出现的异常情况,如文件损坏或者密码错误等。
希望这些信息能够帮助你实现在Java中接收文件并进行加密解密的操作。
java实现Base64加密解密算法
java实现Base64加密解密算法Base64是⽹络上最常见的⽤于传输8Bit字节代码的编码⽅式之⼀,⼤家可以查看RFC2045~RFC2049,上⾯有MIME的详细规范。
Base64编码可⽤于在HTTP环境下传递较长的标识信息。
例如,在Java Persistence系统Hibernate中,就采⽤了Base64来将⼀个较长的唯⼀标识符(⼀般为128-bit的UUID)编码为⼀个字符串,⽤作HTTP表单和HTTP GET URL中的参数。
在其他应⽤程序中,也常常需要把⼆进制数据编码为适合放在URL(包括隐藏表单域)中的形式。
此时,采⽤Base64编码不仅⽐较简短,同时也具有不可读性,即所编码的数据不会被⼈⽤⾁眼所直接看到。
java的加密⽅式有很多中,现在给⼤家分享⼀个Base64加密的⽅式package com.crypt;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;/*** BASE64加密解密* @author YUANWEi*/public class BASE64 {/*** BASE64解密** @param key* @return* @throws Exception*/public static byte[] decryptBASE64(String key) throws Exception {return (new BASE64Decoder()).decodeBuffer(key);}/*** BASE64加密** @param key* @return* @throws Exception*/public static String encryptBASE64(byte[] key) throws Exception {return (new BASE64Encoder()).encodeBuffer(key);}}为什么要使⽤Base64加密呢?Base64编码的作⽤:由于某些系统中只能使⽤ASCII字符。
java进行字符串加密解密算法
// 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
StringBuffer sb = newStringBuffer(iLen * 2);
for(inti = 0; i < iLen; i++) {
intintTmp = arrB[i];
privatestaticString strDefaultKey = "tourhb";
/** 加密工具 */
privateCipher encryptCipher = null;
/** 解密工具 */
privateCipher decryptCipher = null;
/**
* 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]
* hexStr2ByteArr(String strIn) 互为可逆的转换过程
*
* @param arrB
* 需要转换的byte数组
* @return 转换后的字符串
* @throws Exception
*
*/
publicstaticString byteArr2HexStr(byte[] arrB) throwsException {
arrB[i] = arrBTmp[i];
}
// 生成密钥
Key key = newjavax.crypto.spec.SecretKeySpec(arrB, "DES");
returnkey;
}
// 把负数转换为正数
while(intTmp < 0) {
Java使用Hutool实现AES、DES加密解密的方法
Java使⽤Hutool实现AES、DES加密解密的⽅法在Java世界中,AES、DES加密解密需要使⽤Cipher对象构建加密解密系统,Hutool中对这⼀对象做再包装,简化了加密解密过程。
介绍AES和DES同属对称加密算法,数据发信⽅将明⽂(原始数据)和加密密钥⼀起经过特殊加密算法处理后,使其变成复杂的加密密⽂发送出去。
收信⽅收到密⽂后,若想解读原⽂,则需要使⽤加密⽤过的密钥及相同算法的逆算法对密⽂进⾏解密,才能使其恢复成可读明⽂。
在对称加密算法中,使⽤的密钥只有⼀个,发收信双⽅都使⽤这个密钥对数据进⾏加密和解密,这就要求解密⽅事先必须知道加密密钥。
在Java世界中,AES、DES加密解密需要使⽤Cipher对象构建加密解密系统,Hutool中对这⼀对象做再包装,简化了加密解密过程。
引⼊Hutool<dependency><groupId>com.xiaoleilu</groupId><artifactId>hutool-all</artifactId><version>3.0.9</version></dependency>使⽤AES加密解密String content = "test中⽂";//随机⽣成密钥byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();//构建AES aes = SecureUtil.aes(key);//加密byte[] encrypt = aes.encrypt(content);//解密byte[] decrypt = aes.decrypt(encrypt);//加密为16进制表⽰String encryptHex = des.encryptHex(content);//解密为原字符串String decryptStr = des.decryptStr(encryptHex);DES加密解密DES的使⽤⽅式与AES基本⼀致String content = "test中⽂";//随机⽣成密钥byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();//构建DES des = SecureUtil.des(key);//加密解密byte[] encrypt = des.encrypt(content);byte[] decrypt = des.decrypt(encrypt);//加密为16进制,解密为原字符串String encryptHex = des.encryptHex(content);String decryptStr = des.decryptStr(encryptHex);更多Hutool中针对JDK⽀持的所有对称加密算法做了封装,封装为SymmetricCrypto类,AES和DES两个类是此类的简化表⽰。
java相关加密解密方法
java相关加密解密方法Java加密解密方法是保护数据安全的重要手段,本文将详细介绍几种常见的Java加密解密方法。
一、对称加密算法对称加密算法是一种使用相同的密钥进行加密和解密的算法。
这种加密方式简单高效,但存在密钥管理的问题,因为所有用户都必须知道密钥。
在Java中,常用的对称加密算法有DES、3DES、AES等。
1. DES:Data Encryption Standard,数据加密标准,是一种使用56位密钥的对称块密码算法。
在Java中,我们可以使用javax.crypto.Cipher类来实现DES 加密解密。
2. 3DES:Triple Data Encryption Algorithm,三重数据加密算法,是DES的增强版本,使用三个不同的56位密钥进行三次加密。
在Java中,我们同样可以使用Cipher类来实现3DES加密解密。
3. AES:Advanced Encryption Standard,高级加密标准,是一种使用128、192或256位密钥的对称块密码算法。
在Java中,我们可以使用Cipher类来实现AES加密解密。
二、非对称加密算法非对称加密算法是一种使用一对密钥(公钥和私钥)进行加密和解密的算法。
公钥可以公开给所有人,而私钥需要保密。
在Java中,常用的非对称加密算法有RSA、DSA等。
1. RSA:Rivest-Shamir-Adleman,一种基于大数因子分解难题的非对称加密算法。
在Java中,我们可以使用java.security.KeyPairGenerator类生成RSA密钥对,然后使用Cipher类进行RSA加密解密。
2. DSA:Digital Signature Algorithm,数字签名算法,是一种基于整数有限域离散对数难题的非对称加密算法。
在Java中,我们可以使用KeyPairGenerator类生成DSA密钥对,然后使用Signature类进行DSA签名和验证。
java rsa 加密解密流程
java rsa 加密解密流程RSA是一种非对称加密算法,用于数据的加密和解密。
它涉及到公钥和私钥的使用,其中公钥用于加密数据,私钥用于解密数据。
下面是Java中使用RSA 加密和解密的基本流程:1. 生成密钥对:首先需要生成一对RSA密钥,包括公钥和私钥。
可以使用Java提供的`KeyPairGenerator`类来生成密钥对。
```javaKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048); // 指定密钥长度KeyPair keyPair = keyPairGenerator.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();```2. 加密数据:使用公钥对需要加密的数据进行加密。
可以使用`Cipher`类来进行加密操作。
```javaString data = "Hello, World!";Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedData = cipher.doFinal(data.getBytes());```3. 解密数据:使用私钥对加密后的数据进行解密,还原为原始数据。
```javacipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedData = cipher.doFinal(encryptedData);String decryptedText = new String(decryptedData);```请注意,以上示例代码只是一个简单的RSA加密和解密流程的示例。
java后台加密解密方法
java后台加密解密方法Java后台加密解密方法在当今互联网安全领域中具有重要意义。
为了保护数据的安全,各种加密算法应运而生。
本文将介绍几种常见的Java后台加密解密方法,包括RSA、AES、DES和SM2。
1.RSA加密解密原理及实现RSA是一种非对称加密算法,其公钥和私钥是成对存在的。
使用公钥加密后的数据只能通过私钥进行解密。
在Java中,我们可以使用KeyPairGenerator生成一对公私钥,然后使用RSAPrivateKey对数据进行解密。
2.AES加密解密原理及实现AES是一种对称加密算法,加密和解密过程使用相同的密钥。
在Java中,我们可以使用Java的加密库如Java Cryptography Extension (JCE)实现AES 加密解密。
3.DES加密解密原理及实现DES是一种对称加密算法,其加密过程和解密过程使用不同的密钥。
在Java中,我们可以使用Java Cryptography Extension (JCE)实现DES加密解密。
4.SM2加密解密原理及实现SM2是一种国密算法,具有非对称加密和对称加密的特点。
在前端,我们可以使用SM2加密请求参数,然后在后台使用对应的私钥进行解密。
在Java 中,我们可以使用Hutool库实现SM2加密解密。
5.总结:选择合适的加密解密方法及注意事项在实际应用中,选择合适的加密解密方法至关重要。
需要考虑数据安全性、算法复杂度、性能和兼容性等因素。
此外,还需注意以下几点:- 加密解密算法应根据实际需求进行选择,如对称加密算法适用于加密大量数据,非对称加密算法适用于加密少量数据;- 加密密钥和解密密钥应妥善保管,避免泄露;- 在传输加密数据时,应注意防范中间人攻击,可以使用SSL/TLS等安全协议进行保护;- 定期更新和升级加密算法,以应对潜在的安全威胁。
本文介绍了Java后台加密解密方法,包括RSA、AES、DES和SM2。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第17卷 第5期2002年10月内蒙古民族大学学报(自然科学版)Journal of I nner M ongolia U niv ersity for N ationalitiesVol.17 No.5Oct.2002利用Java程序实现加密解密问题y王国忱1,赵 芳1,李亚娟2(1 内蒙古民族大学理工学院,内蒙古通辽 028043;2 内蒙古通辽市通顺铝厂,内蒙古通辽 028000)摘 要:主要介绍了一种用Java语言设计加密解密的方法.关键词:Java;加密;解密中图分类号:JP312JA 文献标识码:A 文章编号:1671 0185(2002)05-0410-03Realize Encryption and Unencryption in Use of Java ProgramWANG Guo-chen1,ZH AO Fang1,LI Ya-juan2(1 College o f Science and Eng ineering,Inner M ong olia U niversity for N ationalities,T ongliao028043,China;2 T ong liao T ong shun A luminium F actory o f Inner M ongo lia,T ongliao028000,China)Abstract:Mainly describe a solution of encryption and unencry ption in use of Java.Key words:Jave;Encryption;U nencryptionJava程序是建立在一系列的类之上,这些类刻画了程序所要处理的基本数据类型的行为.通过向这些类的对象发送信息,从而使这些对象进行相应的操作,这样就构成了Jav a程序.已知一个文本加密解密问题,它遵循如下规则:(1)把明文中的所有字符倒过来,比如Glag to meet you!!变成!uoy teem ot galG!.(2)要求用户提供一个密钥(为一个正整数),设为key.设明文中字符的A SCII码值为x,把x和key相加,再通过一个可逆变换,映射成一个可打印的密文字符,设该字符的ASCII码值为y.因为ASCI I编码表中,0x00~0x1F(0~31)的字符为设备控制字符,所以在变换过程中必须加以避免.映射方法分析如下:设n=(32+key)%128,则可以分成如下规程情况:第一种情况: n<32,则if(x+key)%128<32 y=96+(x+key)%128;else y=(x+key)%128;第二种情况: n>32,则if((x+key)%128<n) y=32+(x+key)%128;else y=(x+key)%128;通过此方法就可以获得打印字符,并且保证是个可逆变换.当然也可以采用其它方法.(3)忽略明文中不可打印字符只要求程序从键盘接收需要加密的明文或者需要解密的密文;然后显示加密后的密文或者解密后的明文.下面讨论如何用面向对象的方法来解决这个问题.首先来确定需要什么类,再为每个类提供操作全集,最后利用继承机制抽取出类之间的共性.在这个问题中,可以看到核心的数据结构有两个,一个为字符串,另一个为字符.在字符串上有两种操作集合,一种是用来加密的集合操作,另一种为用来解密的操作集合,前者可以构成一个加密类Encode.后者可以构成一个解密类Deco de.核心数据结构的另一个为字符,在它之上的操作就是用来进行加密解密函数.只需改写该类的方法即可.因此这个程序需要三个类,它们的属性和操作命令分别为:Encode类y收稿日期:2002-01-06作者简介:王国忱(1975-),男,助教.变量:待处理字符串sS,结果字符串sd,密钥nKey ,用来加密解密的函数对象cd.方法:构造函数Encode(string sStr,int nKey);进行字符串转化的方法Convert();进行字符变换的方法Chang ();获得待处理字符串sS 的方法Getss();获得结果字符串sd 的方法G etss().Decode 类变量:待处理字符串sS,结果字符串sd,密钥sKey,用来加密解密的函数对象cd.方法:构造函数Decode(string sStr ,Int nKey);进行字符串转化的方法Conv er t();进行字符变换的方法Change();获得待处理字符串sS 的方法Getss();获得结果字符串sd 的方法G etsd().Code 类变量:密钥N key ,用于判断加密函数类型的辅助变量n.方法:造函数Code(int nKey);加密函数方法En();解密函数方法De().从这三个类中可以发现:Encode 类和Decode 类几乎相同,它们唯一的区别只是进行字符变换的方法Change()不同,因此从中可以抽取一个类T Code(文本编码基类)作为它们的父类,然后通过继承和重载的方法来获得Encode 和Deco de.整个程序的对象模型如图1所示.图1 程序的对象模型Figure 1 The model of programT ex tCode.java import java.io.*;import javautil.*;public class T ex tCo de{public static void main(string args ∀#){str ing sStr =new String(),sKey,sCmd= !; int nKey=0; char cCmd=∃%;T code tcd=new T code(); try{Input Stream Reader ir =new I nput Stream R eader (System.in);L ine N umber Reader InReader =new L ine N umber R eader(ir);System,out,println( please input the string !);sStr =inR rader.read:Line();System.out.println ( please input the scr yp to gr aphic key:!);sKey=inReader.r eadL ine();NK ey =integer.parselnt(sK ey);System.out.pr intln ( please input the command:(e or d)!);SCmd=inReadr.r eadL ine();CCmd=scmd.charA t(0);}catch(IOException e){system.out.println( Error l !);system.exit(0);}if(cCmd==∃e %){tcd=new Decode(sStr.nK ey);}else if (cCmd==∃d %){tcd=new Decode(sStr.nK ey);}else{System.out.println ( A wr ong command!!);System.ex it(0);}tcd.convert();sStr =tcd.getsD();Syst em.out.println(sStr);}}class T code {string sS,sD;int nKey=0Code cd;T code(){sS= !;nKey=0;cd=new Code(0);}T code(string sStr,int nKey){sS=sStr;411第5期 王国忱等:利用Java 程序实现加密解密问题t his.nKey=nKey;cd=new Code(nKey);}v oid conv ert(){int i,leng=sS.length();char ch,ych;char csD ∀#=new char ∀leng #;character cCh=new Char acter(∃%);stack stck=new Stack();O bject temp=new Object();F or(I=0;I<leng;I++){ch=sS.char At(I);ych=change(ch);cCh=new Character(ych);t emp=stck.push(cCh);}for(I=0;I <leng ,I++){try{cCh=(character)stck.pop();}catch(empty.stack.exception e){System.out.pr intln( the stack is empty!!);}csd ∀I #=cCh.char Value();}sd=new string(csD);}char chang e(char cs){return cs;}string getsD(){return sS;}string getsD(){return sD;}class Encode ex tends T Code {Encode(str ing sStr,int nKey){super(sStr,nK ey);}char chang e(char cs){return cd.en(cs);}}class Decode extends T code {Decode(string sStr.int nK ey ){super(sStr,nK ey);}char chang e(char cs){return cd.de(cs);}}class Decode ex tends T Code {Decode(string sStr.int nKey){super (sStr,nK ey );}char change(char cs){return cd.de(cs);}}class Code &用来加密/解密的函数对象&{int nK ey ,n;Code(int nKey) {this.nKey =nK ey ; n=32+nkey; n=n%128; }char en(char x) {int y; char ych; y =x+nKey; y =y%128; if(n<32){if(y <32)y=y +96;} else{if(y <n)y=y+32;} y ch=(char )y; r eturn ych; }char de(char y oh) {int y=ych; char xch; if(n<32){if(y >(n+96))y=y-96;} else{if(y <n)y=y-32;} y =y-nKey; y =y%128;if(y<0) y =y+128; x ch=(char)y ; r eturn x ch;}}程序执行环境:Jav e2SDK I 3 I 下编译运行.参 考 文 献∀1# 杨有安.Java 语言程序设计∀M #.北京:电子工业出版社,2002.∀2# 清宏计算机工作室编著.Java 编程起步∀M #.北京:机械工业出版社,2002.∀责任编辑 郑 瑛#412内 蒙 古 民 族 大 学 学 报 2002年。