java加密解密代码

java加密解密代码,第1张

package com.cube.limail.util

import javax.crypto.Cipher

import javax.crypto.KeyGenerator

import javax.crypto.SecretKey/**

* 加密解密类

*/

public class Eryptogram

{

private static String Algorithm ="DES"

private String key="CB7A92E3D3491964"

//定义 加密算法,可用 DES,DESede,Blowfish

static boolean debug = false

/**

* 构造子注解.

*/

public Eryptogram ()

{

} /**

* 生成密钥

* @return byte[] 返回生成的密钥

* @throws exception 扔出异常.

*/

public static byte [] getSecretKey () throws Exception

{

KeyGenerator keygen = KeyGenerator.getInstance (Algorithm )

SecretKey deskey = keygen.generateKey ()

System.out.println ("生成密钥:"+bytesToHexString (deskey.getEncoded ()))

if (debug ) System.out.println ("生成密钥:"+bytesToHexString (deskey.getEncoded ()))

return deskey.getEncoded ()

} /**

* 将指定的数据根据提供的密钥进行加密

* @param input 需要加密的数据

* @param key 密钥

* @return byte[] 加密后的数据

* @throws Exception

*/

public static byte [] encryptData (byte [] input ,byte [] key ) throws Exception

{

SecretKey deskey = new javax.crypto.spec.SecretKeySpec (key ,Algorithm )

if (debug )

{

System.out.println ("加密前的二进串:"+byte2hex (input ))

System.out.println ("加密前的字符串:"+new String (input ))

} Cipher c1 = Cipher.getInstance (Algorithm )

c1.init (Cipher.ENCRYPT_MODE ,deskey )

byte [] cipherByte =c1.doFinal (input )

if (debug ) System.out.println ("加密后的二进串:"+byte2hex (cipherByte ))

return cipherByte

} /**

* 将给定的已加密的数据通过指定的密钥进行解密

* @param input 待解密的数据

* @param key 密钥

* @return byte[] 解密后的数据

* @throws Exception

*/

public static byte [] decryptData (byte [] input ,byte [] key ) throws Exception

{

SecretKey deskey = new javax.crypto.spec.SecretKeySpec (key ,Algorithm )

if (debug ) System.out.println ("解密前的信息:"+byte2hex (input ))

Cipher c1 = Cipher.getInstance (Algorithm )

c1.init (Cipher.DECRYPT_MODE ,deskey )

byte [] clearByte =c1.doFinal (input )

if (debug )

{

System.out.println ("解密后的二进串:"+byte2hex (clearByte ))

System.out.println ("解密后的字符串:"+(new String (clearByte )))

} return clearByte

} /**

* 字节码转换成16进制字符串

* @param byte[] b 输入要转换的字节码

* @return String 返回转换后的16进制字符串

*/

public static String byte2hex (byte [] b )

{

String hs =""

String stmp =""

for (int n =0 n <b.length n ++)

{

stmp =(java.lang.Integer.toHexString (b [n ] & 0XFF ))

if (stmp.length ()==1 ) hs =hs +"0"+stmp

else hs =hs +stmp

if (n <b.length -1 ) hs =hs +":"

} return hs.toUpperCase ()

}

/**

* 字符串转成字节数组.

* @param hex 要转化的字符串.

* @return byte[] 返回转化后的字符串.

*/

public static byte[] hexStringToByte(String hex) {

int len = (hex.length() / 2)

byte[] result = new byte[len]

char[] achar = hex.toCharArray()

for (int i = 0i <leni++) {

int pos = i * 2

result[i] = (byte) (toByte(achar[pos]) <<4 | toByte(achar[pos + 1]))

}

return result

}

private static byte toByte(char c) {

byte b = (byte) "0123456789ABCDEF".indexOf(c)

return b

}

/**

* 字节数组转成字符串.

* @param String 要转化的字符串.

* @return 返回转化后的字节数组.

*/

public static final String bytesToHexString(byte[] bArray) {

StringBuffer sb = new StringBuffer(bArray.length)

String sTemp

for (int i = 0i <bArray.lengthi++) {

sTemp = Integer.toHexString(0xFF &bArray[i])

if (sTemp.length() <2)

sb.append(0)

sb.append(sTemp.toUpperCase())

}

return sb.toString()

}

/**

* 从数据库中获取密钥.

* @param deptid 企业id.

* @return 要返回的字节数组.

* @throws Exception 可能抛出的异常.

*/

public static byte[] getSecretKey(long deptid) throws Exception {

byte[] key=null

String value=null

//CommDao dao=new CommDao()

// List list=dao.getRecordList("from Key k where k.deptid="+deptid)

//if(list.size()>0){

//value=((com.csc.sale.bean.Key)list.get(0)).getKey()

value = "CB7A92E3D3491964"

key=hexStringToByte(value)

//}

if (debug)

System.out.println("密钥:" + value)

return key

}

public String encryptData2(String data) {

String en = null

try {

byte[] key=hexStringToByte(this.key)

en = bytesToHexString(encryptData(data.getBytes(),key))

} catch (Exception e) {

e.printStackTrace()

}

return en

}

public String decryptData2(String data) {

String de = null

try {

byte[] key=hexStringToByte(this.key)

de = new String(decryptData(hexStringToByte(data),key))

} catch (Exception e) {

e.printStackTrace()

}

return de

}

} 加密使用: byte[] key=Eryptogram.getSecretKey(deptid) //获得钥匙(字节数组)

byte[] tmp=Eryptogram.encryptData(password.getBytes(), key) //传入密码和钥匙,获得加密后的字节数组的密码

password=Eryptogram.bytesToHexString(tmp) //将字节数组转化为字符串,获得加密后的字符串密码解密与之差不多

加多一个判断,当输入的长度小于指定长度的时候,出错;

如果超出指定长度,则取前几位,譬如指定6位,输入123, 出错;输入123456789,那就只处理123456,忽略后面的789

import java.util.HashMap

import java.util.Map

import java.util.Scanner

public class Test {

public static void main(String[] args) throws Exception {

System.out.print("请输入加密(解密)和要处理的数字个数:1为加密,2为解密; ")

Scanner scanner = new Scanner(System.in)

String[] input1 = scanner.nextLine().split("\\s+")

String choice = input1[0]

int count = Integer.parseInt(input1[1])

System.out.print("请输入要处理的数字,用空格隔开:")

String input = scanner.nextLine().replaceAll("\\s+", "")

if(input.length() <count){

throw new Exception("不足" + count + "位数字,请检查输入")

}else if(input.length() >count){

System.out.println("太多数字,将处理前" + count + "个数字:" +

input.substring(0, 6))

input = input.substring(0, 6)

}

if(choice.equals("1")){

if(input.length() <count){

}

String encode = EncodeUtil.encode(input)

System.out.println("加密后的数字是: " + encode)

}else{

String decode = EncodeUtil.decode(input)

System.out.println("解密后的数字: " + decode)

}

}

}

class EncodeUtil{

private static Map<String, String>encodeMap = null

private static Map<String, String>decodeMap = null

public final static String encode(String strToEncode){

if(encodeMap == null){

encodeMap = new HashMap<String, String>()

encodeMap.put("0", "7")

encodeMap.put("1", "5")

encodeMap.put("2", "9")

encodeMap.put("3", "1")

encodeMap.put("4", "3")

encodeMap.put("5", "6")

encodeMap.put("6", "8")

encodeMap.put("7", "0")

encodeMap.put("8", "2")

encodeMap.put("9", "4")

}

StringBuilder sb = new StringBuilder()

for(int i = 0i <strToEncode.length()i++){

sb.append(encodeMap.get(String.valueOf(strToEncode.charAt(i))))

}

return sb.toString()

}

public final static String decode(String strToDecode){

if(decodeMap == null){

decodeMap = new HashMap<String, String>()

decodeMap.put("7", "0")

decodeMap.put("5", "1")

decodeMap.put("9", "2")

decodeMap.put("1", "3")

decodeMap.put("3", "4")

decodeMap.put("6", "5")

decodeMap.put("8", "6")

decodeMap.put("0", "7")

decodeMap.put("2", "8")

decodeMap.put("4", "9")

}

StringBuilder sb = new StringBuilder()

for(int i = 0i <strToDecode.length()i++){

sb.append(decodeMap.get(String.valueOf(strToDecode.charAt(i))))

}

return sb.toString()

}

}

------------------测试

C:\Program Files\IBM\RAD 7\jdk\bin>java Test

请输入加密(解密)和要处理的数字个数:1为加密,2为解密; 1 6

请输入要处理的数字,用空格隔开:1 2 3

Exception in thread "main" java.lang.Exception: 不足6位数字,请检查输入

at Test.main(Test.java:19)

C:\Program Files\IBM\RAD 7\jdk\bin>java Test

请输入加密(解密)和要处理的数字个数:1为加密,2为解密; 1 6

请输入要处理的数字,用空格隔开:1 2 3 4 5 6 7

太多数字,将处理前6个数字:123456

加密后的数字是: 591368

C:\Program Files\IBM\RAD 7\jdk\bin>java Test

请输入加密(解密)和要处理的数字个数:1为加密,2为解密; 1 6

请输入要处理的数字,用空格隔开:1 9 9 7 7 1

加密后的数字是: 544005

C:\Program Files\IBM\RAD 7\jdk\bin>java Test

请输入加密(解密)和要处理的数字个数:1为加密,2为解密; 2 6

请输入要处理的数字,用空格隔开:5 4 4 0 0 5

解密后的数字: 199771


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12099050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存