java加密解密代码

java加密解密代码,第1张

package comcubelimailutil;

import javaxcryptoCipher;

import javaxcryptoKeyGenerator;

import javaxcryptoSecretKey;/

加密解密类

/

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 = KeyGeneratorgetInstance (Algorithm );

SecretKey deskey = keygengenerateKey ();

Systemoutprintln ("生成密钥:"+bytesToHexString (deskeygetEncoded ()));

if (debug ) Systemoutprintln ("生成密钥:"+bytesToHexString (deskeygetEncoded ()));

return deskeygetEncoded ();

} /

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

@param input 需要加密的数据

@param key 密钥

@return byte[] 加密后的数据

@throws Exception

/

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

{

SecretKey deskey = new javaxcryptospecSecretKeySpec (key ,Algorithm );

if (debug )

{

Systemoutprintln ("加密前的二进串:"+byte2hex (input ));

Systemoutprintln ("加密前的字符串:"+new String (input ));

} Cipher c1 = CiphergetInstance (Algorithm );

c1init (CipherENCRYPT_MODE ,deskey );

byte [] cipherByte =c1doFinal (input );

if (debug ) Systemoutprintln ("加密后的二进串:"+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 javaxcryptospecSecretKeySpec (key ,Algorithm );

if (debug ) Systemoutprintln ("解密前的信息:"+byte2hex (input ));

Cipher c1 = CiphergetInstance (Algorithm );

c1init (CipherDECRYPT_MODE ,deskey );

byte [] clearByte =c1doFinal (input );

if (debug )

{

Systemoutprintln ("解密后的二进串:"+byte2hex (clearByte ));

Systemoutprintln ("解密后的字符串:"+(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 <blength ;n ++)

{

stmp =(javalangIntegertoHexString (b [n ] & 0XFF ));

if (stmplength ()==1 ) hs =hs +"0"+stmp ;

else hs =hs +stmp ;

if (n <blength -1 ) hs =hs +":";

} return hstoUpperCase ();

}

/

字符串转成字节数组

@param hex 要转化的字符串

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

/

public static byte[] hexStringToByte(String hex) {

int len = (hexlength() / 2);

byte[] result = new byte[len];

char[] achar = hextoCharArray();

for (int i = 0; i < len; i++) {

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(bArraylength);

String sTemp;

for (int i = 0; i < bArraylength; i++) {

sTemp = IntegertoHexString(0xFF & bArray[i]);

if (sTemplength() < 2)

sbappend(0);

sbappend(sTemptoUpperCase());

}

return sbtoString();

}

/

从数据库中获取密钥

@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=daogetRecordList("from Key k where kdeptid="+deptid);

//if(listsize()>0){

//value=((comcscsalebeanKey)listget(0))getKey();

value = "CB7A92E3D3491964";

key=hexStringToByte(value);

//}

if (debug)

Systemoutprintln("密钥:" + value);

return key;

}

public String encryptData2(String data) {

String en = null;

try {

byte[] key=hexStringToByte(thiskey);

en = bytesToHexString(encryptData(datagetBytes(),key));

} catch (Exception e) {

eprintStackTrace();

}

return en;

}

public String decryptData2(String data) {

String de = null;

try {

byte[] key=hexStringToByte(thiskey);

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

} catch (Exception e) {

eprintStackTrace();

}

return de;

}

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

byte[] tmp=EryptogramencryptData(passwordgetBytes(), key); //传入密码和钥匙,获得加密后的字节数组的密码

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

Cipher c=CiphergetInstance("AES");

cinit(cENCRYPT_MODE,new SecretKeySpec("1111111111111111"getBytes(),"AES"));

FileOutputStream fos=new FileOutputStream("/1dat");

foswrite(cdoFinal("我神不是人啊~~"getBytes()));

cinit(cDECRYPT_MODE,new SecretKeySpec("1111111111111111"getBytes(),"AES"));

FileInputStream fin=new FileInputStream("/1dat");

byte b[]=new byte[1024];

Systemoutprintln(new String(cdoFinal(b,0,finread(b))));

Java是一种跨平台的、解释型语言。Java 源代码编译中间“字节码”存储于class文件中。Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名等。因此,Java中间代码的反编译就变得非常轻易。目前市场上有许多免费的、商用的反编译软件,都能够生成高质量的反编译后的源代码。所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。本文首先讨论了保护Java程序的基本方法,然后对代码混淆问题进行深入研究,最后结合一个实际的应用程序,分析如何在实践中保护Java程序。

反编译成为保护Java程序的最大挑战通常C、C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制可执行代码。通常所有的源文件被编译、链接成一个可执行文件。在这些可执行文件中,编译器删除了程序中的变量名称、方法名称等信息,这些信息往往是由内存地址表示,例如假如需要使用一个变量,往往是通过这个变量的地址来访问的。因此,反编译这些本地的目标代码就是非常困难的。

Java语言的出现,使得反编译变得非常轻易而有效。原因如下:1由于跨平台的需求,Java的指令集比较简单而通用,较轻易得出程序的语义信息;2Java编译器将每一个类编译成一个单独的文件,这也简化了反编译的工作;3Java 的Class文件中,仍然保留所有的方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。由于Java程序自身的特点,对于不经过处理的Java程序反编译的效果非常好。

目前,市场上有许多Java的反编译工具,有免费的,也有商业使用的,还有的是开放源代码的。这些工具的反编译速度和效果都非常不错。好的反编译软件,能够反编译出非常接近源代码的程序。因此,通过反编译器,黑客能够对这些程序进行更改,或者复用其中的程序。因此,如何保护Java程序不被反编译,是非常重要的一个问题。

常用的保护技术由于Java字节码的抽象级别较高,因此它们较轻易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。

隔离Java程序最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将要害的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件。这样黑客就没有办法反编译Class文件。目前,通过接口提供服务的标准和协议也越来越多,例如 >

/

SHA-1加密函数

/

public class SsytemSha1 {

private final int[] abcde = {

0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0

};

// 摘要数据存储数组

private int[] digestInt = new int[5];

// 计算过程中的临时数据存储数组

private int[] tmpData = new int[80];

// 计算sha-1摘要

private int process_input_bytes(byte[] bytedata) {

// 初试化常量

Systemarraycopy(abcde, 0, digestInt, 0, abcdelength);

// 格式化输入字节数组,补10及长度数据

byte[] newbyte = byteArrayFormatData(bytedata);

// 获取数据摘要计算的数据单元个数

int MCount = newbytelength / 64;

// 循环对每个数据单元进行摘要计算

for (int pos = 0; pos < MCount; pos++) {

// 将每个单元的数据转换成16个整型数据,并保存到tmpData的前16个数组元素中

for (int j = 0; j < 16; j++) {

tmpData[j] = byteArrayToInt(newbyte, (pos 64) + (j 4));

}

// 摘要计算函数

encrypt();

}

return 20;

}

// 格式化输入字节数组格式

private byte[] byteArrayFormatData(byte[] bytedata) {

// 补0数量

int zeros = 0;

// 补位后总位数

int size = 0;

// 原始数据长度

int n = bytedatalength;

// 模64后的剩余位数

int m = n % 64;

// 计算添加0的个数以及添加10后的总长度

if (m < 56) {

zeros = 55 - m;

size = n - m + 64;

} else if (m == 56) {

zeros = 63;

size = n + 8 + 64;

} else {

zeros = 63 - m + 56;

size = (n + 64) - m + 64;

}

// 补位后生成的新数组内容

byte[] newbyte = new byte[size];

// 复制数组的前面部分

Systemarraycopy(bytedata, 0, newbyte, 0, n);

// 获得数组Append数据元素的位置

int l = n;

// 补1 *** 作

newbyte[l++] = (byte) 0x80;

// 补0 *** 作

for (int i = 0; i < zeros; i++) {

newbyte[l++] = (byte) 0x00;

}

// 计算数据长度,补数据长度位共8字节,长整型

long N = (long) n 8;

byte h8 = (byte) (N & 0xFF);

byte h7 = (byte) ((N >> 8) & 0xFF);

byte h6 = (byte) ((N >> 16) & 0xFF);

byte h5 = (byte) ((N >> 24) & 0xFF);

byte h4 = (byte) ((N >> 32) & 0xFF);

byte h3 = (byte) ((N >> 40) & 0xFF);

byte h2 = (byte) ((N >> 48) & 0xFF);

byte h1 = (byte) (N >> 56);

newbyte[l++] = h1;

newbyte[l++] = h2;

newbyte[l++] = h3;

newbyte[l++] = h4;

newbyte[l++] = h5;

newbyte[l++] = h6;

newbyte[l++] = h7;

newbyte[l++] = h8;

return newbyte;

}

private int f1(int x, int y, int z) {

return (x & y) | (~x & z);

}

private int f2(int x, int y, int z) {

return x ^ y ^ z;

}

private int f3(int x, int y, int z) {

return (x & y) | (x & z) | (y & z);

}

private int f4(int x, int y) {

return (x << y) | x >>> (32 - y);

}

// 单元摘要计算函数

private void encrypt() {

for (int i = 16; i <= 79; i++) {

tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^

tmpData[i - 16], 1);

}

int[] tmpabcde = new int[5];

for (int i1 = 0; i1 < tmpabcdelength; i1++) {

tmpabcde[i1] = digestInt[i1];

}

for (int j = 0; j <= 19; j++) {

int tmp = f4(tmpabcde[0], 5) +

f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +

tmpData[j] + 0x5a827999;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int k = 20; k <= 39; k++) {

int tmp = f4(tmpabcde[0], 5) +

f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +

tmpData[k] + 0x6ed9eba1;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int l = 40; l <= 59; l++) {

int tmp = f4(tmpabcde[0], 5) +

f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +

tmpData[l] + 0x8f1bbcdc;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int m = 60; m <= 79; m++) {

int tmp = f4(tmpabcde[0], 5) +

f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +

tmpData[m] + 0xca62c1d6;

tmpabcde[4] = tmpabcde[3];

tmpabcde[3] = tmpabcde[2];

tmpabcde[2] = f4(tmpabcde[1], 30);

tmpabcde[1] = tmpabcde[0];

tmpabcde[0] = tmp;

}

for (int i2 = 0; i2 < tmpabcdelength; i2++) {

digestInt[i2] = digestInt[i2] + tmpabcde[i2];

}

for (int n = 0; n < tmpDatalength; n++) {

tmpData[n] = 0;

}

}

// 4字节数组转换为整数

private int byteArrayToInt(byte[] bytedata, int i) {

return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) |

((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);

}

// 整数转换为4字节数组

private void intToByteArray(int intValue, byte[] byteData, int i) {

byteData[i] = (byte) (intValue >>> 24);

byteData[i + 1] = (byte) (intValue >>> 16);

byteData[i + 2] = (byte) (intValue >>> 8);

byteData[i + 3] = (byte) intValue;

}

// 将字节转换为十六进制字符串

private static String byteToHexString(byte ib) {

char[] Digit = {

'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',

'D', 'E', 'F'

};

char[] ob = new char[2];

ob[0] = Digit[(ib >>> 4) & 0X0F];

ob[1] = Digit[ib & 0X0F];

String s = new String(ob);

return s;

}

// 将字节数组转换为十六进制字符串

private static String byteArrayToHexString(byte[] bytearray) {

String strDigest = "";

for (int i = 0; i < bytearraylength; i++) {

strDigest += byteToHexString(bytearray[i]);

}

return strDigest;

}

// 计算sha-1摘要,返回相应的字节数组

public byte[] getDigestOfBytes(byte[] byteData) {

process_input_bytes(byteData);

byte[] digest = new byte[20];

for (int i = 0; i < digestIntlength; i++) {

intToByteArray(digestInt[i], digest, i 4);

}

return digest;

}

// 计算sha-1摘要,返回相应的十六进制字符串

public String getDigestOfString(byte[] byteData) {

return byteArrayToHexString(getDigestOfBytes(byteData));

}

public static void main(String[] args) { //测试通过

String data = "123";

String digest = new SsytemSha1()getDigestOfString(datagetBytes());

}

}

java加密字符串可以使用des加密算法,实例如下:

package test;

import javaioFileInputStream;

import javaioFileOutputStream;

import javaioIOException;

import javaioObjectInputStream;

import javaioObjectOutputStream;

import javasecurity;

import javaxcryptoCipher;

import javaxcryptoKeyGenerator;

import javaxcryptoSecretKey;

/

加密解密

@author shyqiu

@since

/

public class CryptTest {

/

进行MD5加密

@param info

要加密的信息

@return String 加密后的字符串

/

public String encryptToMD5(String info) {

byte[] digesta = null;

try {

// 得到一个md5的消息摘要

MessageDigest alga = MessageDigestgetInstance("MD5");

// 添加要进行计算摘要的信息

algaupdate(infogetBytes());

// 得到该摘要

digesta = algadigest();

} catch (NoSuchAlgorithmException e) {

eprintStackTrace();

}

// 将摘要转为字符串

String rs = byte2hex(digesta);

return rs;

}

/

进行SHA加密

@param info

要加密的信息

@return String 加密后的字符串

/

public String encryptToSHA(String info) {

byte[] digesta = null;

try {

// 得到一个SHA-1的消息摘要

MessageDigest alga = MessageDigestgetInstance("SHA-1");

// 添加要进行计算摘要的信息

algaupdate(infogetBytes());

// 得到该摘要

digesta = algadigest();

} catch (NoSuchAlgorithmException e) {

eprintStackTrace();

}

// 将摘要转为字符串

String rs = byte2hex(digesta);

return rs;

}

// //////////////////////////////////////////////////////////////////////////

/

创建密匙

@param algorithm

加密算法,可用 DES,DESede,Blowfish

@return SecretKey 秘密(对称)密钥

/

public SecretKey createSecretKey(String algorithm) {

// 声明KeyGenerator对象

KeyGenerator keygen;

// 声明 密钥对象

SecretKey deskey = null;

try {

// 返回生成指定算法的秘密密钥的 KeyGenerator 对象

keygen = KeyGeneratorgetInstance(algorithm);

// 生成一个密钥

deskey = keygengenerateKey();

} catch (NoSuchAlgorithmException e) {

eprintStackTrace();

}

// 返回密匙

return deskey;

}

/

根据密匙进行DES加密

@param key

密匙

@param info

要加密的信息

@return String 加密后的信息

/

public String encryptToDES(SecretKey key, String info) {

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

String Algorithm = "DES";

// 加密随机数生成器 (RNG),(可以不写)

SecureRandom sr = new SecureRandom();

// 定义要生成的密文

byte[] cipherByte = null;

try {

// 得到加密/解密器

Cipher c1 = CiphergetInstance(Algorithm);

// 用指定的密钥和模式初始化Cipher对象

// 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

c1init(CipherENCRYPT_MODE, key, sr);

// 对要加密的内容进行编码处理,

cipherByte = c1doFinal(infogetBytes());

} catch (Exception e) {

eprintStackTrace();

}

// 返回密文的十六进制形式

return byte2hex(cipherByte);

}

/

根据密匙进行DES解密

@param key

密匙

@param sInfo

要解密的密文

@return String 返回解密后信息

/

public String decryptByDES(SecretKey key, String sInfo) {

// 定义 加密算法,

String Algorithm = "DES";

// 加密随机数生成器 (RNG)

SecureRandom sr = new SecureRandom();

byte[] cipherByte = null;

try {

// 得到加密/解密器

Cipher c1 = CiphergetInstance(Algorithm);

// 用指定的密钥和模式初始化Cipher对象

c1init(CipherDECRYPT_MODE, key, sr);

// 对要解密的内容进行编码处理

cipherByte = c1doFinal(hex2byte(sInfo));

} catch (Exception e) {

eprintStackTrace();

}

// return byte2hex(cipherByte);

return new String(cipherByte);

}

// /////////////////////////////////////////////////////////////////////////////

/

创建密匙组,并将公匙,私匙放入到指定文件中

默认放入mykeysbat文件中

/

public void createPairKey() {

try {

// 根据特定的算法一个密钥对生成器

KeyPairGenerator keygen = KeyPairGeneratorgetInstance("DSA");

// 加密随机数生成器 (RNG)

SecureRandom random = new SecureRandom();

// 重新设置此随机对象的种子

randomsetSeed(1000);

// 使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器

keygeninitialize(512, random);// keygeninitialize(512);

// 生成密钥组

KeyPair keys = keygengenerateKeyPair();

// 得到公匙

PublicKey pubkey = keysgetPublic();

// 得到私匙

PrivateKey prikey = keysgetPrivate();

// 将公匙私匙写入到文件当中

doObjToFile("mykeysbat", new Object[] { prikey, pubkey });

} catch (NoSuchAlgorithmException e) {

eprintStackTrace();

}

}

/

利用私匙对信息进行签名 把签名后的信息放入到指定的文件中

@param info

要签名的信息

@param signfile

存入的文件

/

public void signToInfo(String info, String signfile) {

// 从文件当中读取私匙

PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeysbat", 1);

// 从文件中读取公匙

PublicKey mypubkey = (PublicKey) getObjFromFile("mykeysbat", 2);

try {

// Signature 对象可用来生成和验证数字签名

Signature signet = SignaturegetInstance("DSA");

// 初始化签署签名的私钥

signetinitSign(myprikey);

// 更新要由字节签名或验证的数据

signetupdate(infogetBytes());

// 签署或验证所有更新字节的签名,返回签名

byte[] signed = signetsign();

// 将数字签名,公匙,信息放入文件中

doObjToFile(signfile, new Object[] { signed, mypubkey, info });

} catch (Exception e) {

eprintStackTrace();

}

}

/

读取数字签名文件 根据公匙,签名,信息验证信息的合法性

@return true 验证成功 false 验证失败

/

public boolean validateSign(String signfile) {

// 读取公匙

PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);

// 读取签名

byte[] signed = (byte[]) getObjFromFile(signfile, 1);

// 读取信息

String info = (String) getObjFromFile(signfile, 3);

try {

// 初始一个Signature对象,并用公钥和签名进行验证

Signature signetcheck = SignaturegetInstance("DSA");

// 初始化验证签名的公钥

signetcheckinitVerify(mypubkey);

// 使用指定的 byte 数组更新要签名或验证的数据

signetcheckupdate(infogetBytes());

Systemoutprintln(info);

// 验证传入的签名

return signetcheckverify(signed);

} catch (Exception e) {

eprintStackTrace();

return false;

}

}

/

将二进制转化为16进制字符串

@param b

二进制字节数组

@return String

/

public String byte2hex(byte[] b) {

String hs = "";

String stmp = "";

for (int n = 0; n < blength; n++) {

stmp = (javalangIntegertoHexString(b[n] & 0XFF));

if (stmplength() == 1) {

hs = hs + "0" + stmp;

} else {

hs = hs + stmp;

}

}

return hstoUpperCase();

}

/

十六进制字符串转化为2进制

@param hex

@return

/

public byte[] hex2byte(String hex) {

byte[] ret = new byte[8];

byte[] tmp = hexgetBytes();

for (int i = 0; i < 8; i++) {

ret[i] = uniteBytes(tmp[i 2], tmp[i 2 + 1]);

}

return ret;

}

/

将两个ASCII字符合成一个字节; 如:"EF"--> 0xEF

@param src0

byte

@param src1

byte

@return byte

/

public static byte uniteBytes(byte src0, byte src1) {

byte _b0 = Bytedecode("0x" + new String(new byte[] { src0 }))

byteValue();

_b0 = (byte) (_b0 << 4);

byte _b1 = Bytedecode("0x" + new String(new byte[] { src1 }))

byteValue();

byte ret = (byte) (_b0 ^ _b1);

return ret;

}

/

将指定的对象写入指定的文件

@param file

指定写入的文件

@param objs

要写入的对象

/

public void doObjToFile(String file, Object[] objs) {

ObjectOutputStream oos = null;

try {

FileOutputStream fos = new FileOutputStream(file);

oos = new ObjectOutputStream(fos);

for (int i = 0; i < objslength; i++) {

ooswriteObject(objs[i]);

}

} catch (Exception e) {

eprintStackTrace();

} finally {

try {

oosclose();

} catch (IOException e) {

eprintStackTrace();

}

}

}

/

返回在文件中指定位置的对象

@param file

指定的文件

@param i

从1开始

@return

/

public Object getObjFromFile(String file, int i) {

ObjectInputStream ois = null;

Object obj = null;

try {

FileInputStream fis = new FileInputStream(file);

ois = new ObjectInputStream(fis);

for (int j = 0; j < i; j++) {

obj = oisreadObject();

}

} catch (Exception e) {

eprintStackTrace();

} finally {

try {

oisclose();

} catch (IOException e) {

eprintStackTrace();

}

}

return obj;

}

/

测试

@param args

/

public static void main(String[] args) {

CryptTest jiami = new CryptTest();

// 执行MD5加密"Hello world!"

Systemoutprintln("Hello经过MD5:" + jiamiencryptToMD5("Hello"));

// 生成一个DES算法的密匙

SecretKey key = jiamicreateSecretKey("DES");

// 用密匙加密信息"Hello world!"

String str1 = jiamiencryptToDES(key, "Hello");

Systemoutprintln("使用des加密信息Hello为:" + str1);

// 使用这个密匙解密

String str2 = jiamidecryptByDES(key, str1);

Systemoutprintln("解密后为:" + str2);

// 创建公匙和私匙

jiamicreatePairKey();

// 对Hello world!使用私匙进行签名

jiamisignToInfo("Hello", "mysignbat");

// 利用公匙对签名进行验证。

if (jiamivalidateSign("mysignbat")) {

Systemoutprintln("Success!");

} else {

Systemoutprintln("Fail!");

}

}

}

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

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

import javautilHashMap;

import javautilMap;

import javautilScanner;

public class Test {

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

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

Scanner scanner = new Scanner(Systemin);

String[] input1 = scannernextLine()split("\\s+");

String choice = input1[0];

int count = IntegerparseInt(input1[1]);

Systemoutprint("请输入要处理的数字,用空格隔开:");

String input = scannernextLine()replaceAll("\\s+", "");

if(inputlength() < count){

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

}else if(inputlength() > count){

Systemoutprintln("太多数字,将处理前" + count + "个数字:" +

inputsubstring(0, 6));

input = inputsubstring(0, 6);

}

if(choiceequals("1")){

if(inputlength() < count){

}

String encode = EncodeUtilencode(input);

Systemoutprintln("加密后的数字是: " + encode);

}else{

String decode = EncodeUtildecode(input);

Systemoutprintln("解密后的数字: " + 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>();

encodeMapput("0", "7");

encodeMapput("1", "5");

encodeMapput("2", "9");

encodeMapput("3", "1");

encodeMapput("4", "3");

encodeMapput("5", "6");

encodeMapput("6", "8");

encodeMapput("7", "0");

encodeMapput("8", "2");

encodeMapput("9", "4");

}

StringBuilder sb = new StringBuilder();

for(int i = 0; i < strToEncodelength(); i++){

sbappend(encodeMapget(StringvalueOf(strToEncodecharAt(i))));

}

return sbtoString();

}

public final static String decode(String strToDecode){

if(decodeMap == null){

decodeMap = new HashMap<String, String>();

decodeMapput("7", "0");

decodeMapput("5", "1");

decodeMapput("9", "2");

decodeMapput("1", "3");

decodeMapput("3", "4");

decodeMapput("6", "5");

decodeMapput("8", "6");

decodeMapput("0", "7");

decodeMapput("2", "8");

decodeMapput("4", "9");

}

StringBuilder sb = new StringBuilder();

for(int i = 0; i < strToDecodelength(); i++){

sbappend(decodeMapget(StringvalueOf(strToDecodecharAt(i))));

}

return sbtoString();

}

}

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

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

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

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

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

at Testmain(Testjava: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

最简单的,用异或运算。

你也可以自己写个加密方法啊。

比如说:利用unicode字符加密啊。假设一个数字a它的unicode值是1234,你自己设计个函数,比如说y=2x^3+3,得到一个新的unicode字符,然后把这个unicode字符转换为字母,这个字母可能是汉字,但更可能是外国符文,反正一般人不会认出来的。你解密的时候,倒推一下就行了。

以上就是关于java加密解密代码全部的内容,包括:java加密解密代码、Java软件如何加密、如何用java程序实现加密的序列号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9351389.html

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

发表评论

登录后才能评论

评论列表(0条)

保存