如何用JAVA实现字符串简单加密解密
发布时间:2025-05-19 22:09:13 发布人:远客网络
一、如何用JAVA实现字符串简单加密解密
java加密字符串可以使用des加密算法,实例如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
*@since
public String encryptToMD5(String info){
MessageDigest alga= MessageDigest.getInstance("MD5");
alga.update(info.getBytes());
} catch(NoSuchAlgorithmException e){
String rs= byte2hex(digesta);
public String encryptToSHA(String info){
MessageDigest alga= MessageDigest.getInstance("SHA-1");
alga.update(info.getBytes());
} catch(NoSuchAlgorithmException e){
String rs= byte2hex(digesta);
////////////////////////////////////////////////////////////////////////////
*加密算法,可用 DES,DESede,Blowfish
*@return SecretKey秘密(对称)密钥
public SecretKey createSecretKey(String algorithm){
//返回生成指定算法的秘密密钥的 KeyGenerator对象
keygen= KeyGenerator.getInstance(algorithm);
deskey= keygen.generateKey();
} catch(NoSuchAlgorithmException e){
public String encryptToDES(SecretKey key, String info){
//定义加密算法,可用 DES,DESede,Blowfish
//加密随机数生成器(RNG),(可以不写)
SecureRandom sr= new SecureRandom();
Cipher c1= Cipher.getInstance(Algorithm);
//用指定的密钥和模式初始化Cipher对象
//参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
c1.init(Cipher.ENCRYPT_MODE, key, sr);
cipherByte= c1.doFinal(info.getBytes());
public String decryptByDES(SecretKey key, String sInfo){
SecureRandom sr= new SecureRandom();
Cipher c1= Cipher.getInstance(Algorithm);
//用指定的密钥和模式初始化Cipher对象
c1.init(Cipher.DECRYPT_MODE, key, sr);
cipherByte= c1.doFinal(hex2byte(sInfo));
// return byte2hex(cipherByte);
return new String(cipherByte);
///////////////////////////////////////////////////////////////////////////////
*创建密匙组,并将公匙,私匙放入到指定文件中
//根据特定的算法一个密钥对生成器
KeyPairGenerator keygen= KeyPairGenerator.getInstance("DSA");
SecureRandom random= new SecureRandom();
//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器
keygen.initialize(512, random);// keygen.initialize(512);
KeyPair keys= keygen.generateKeyPair();
PublicKey pubkey= keys.getPublic();
PrivateKey prikey= keys.getPrivate();
doObjToFile("mykeys.bat", new Object[]{ prikey, pubkey});
} catch(NoSuchAlgorithmException e){
*利用私匙对信息进行签名把签名后的信息放入到指定的文件中
public void signToInfo(String info, String signfile){
PrivateKey myprikey=(PrivateKey) getObjFromFile("mykeys.bat", 1);
PublicKey mypubkey=(PublicKey) getObjFromFile("mykeys.bat", 2);
// Signature对象可用来生成和验证数字签名
Signature signet= Signature.getInstance("DSA");
//更新要由字节签名或验证的数据
signet.update(info.getBytes());
//签署或验证所有更新字节的签名,返回签名
byte[] signed= signet.sign();
//将数字签名,公匙,信息放入文件中
doObjToFile(signfile, new Object[]{ signed, mypubkey, info});
*读取数字签名文件根据公匙,签名,信息验证信息的合法性
*@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);
//初始一个Signature对象,并用公钥和签名进行验证
Signature signetcheck= Signature.getInstance("DSA");
signetcheck.initVerify(mypubkey);
//使用指定的 byte数组更新要签名或验证的数据
signetcheck.update(info.getBytes());
return signetcheck.verify(signed);
public String byte2hex(byte[] b){
for(int n= 0; n< b.length; n++){
stmp=(java.lang.Integer.toHexString(b[n]& 0XFF));
public byte[] hex2byte(String hex){
ret[i]= uniteBytes(tmp[i* 2], tmp[i* 2+ 1]);
*将两个ASCII字符合成一个字节;如:"EF"--> 0xEF
public static byte uniteBytes(byte src0, byte src1){
byte _b0= Byte.decode("0x"+ new String(new byte[]{ src0}))
byte _b1= Byte.decode("0x"+ new String(new byte[]{ src1}))
public void doObjToFile(String file, Object[] objs){
ObjectOutputStream oos= null;
FileOutputStream fos= new FileOutputStream(file);
oos= new ObjectOutputStream(fos);
for(int i= 0; i< objs.length; i++){
public Object getObjFromFile(String file, int i){
FileInputStream fis= new FileInputStream(file);
ois= new ObjectInputStream(fis);
public static void main(String[] args){
CryptTest jiami= new CryptTest();
System.out.println("Hello经过MD5:"+ jiami.encryptToMD5("Hello"));
SecretKey key= jiami.createSecretKey("DES");
//用密匙加密信息"Hello world!"
String str1= jiami.encryptToDES(key,"Hello");
System.out.println("使用des加密信息Hello为:"+ str1);
String str2= jiami.decryptByDES(key, str1);
System.out.println("解密后为:"+ str2);
//对Hello world!使用私匙进行签名
jiami.signToInfo("Hello","mysign.bat");
if(jiami.validateSign("mysign.bat")){
System.out.println("Success!");
二、java环境下实现idea算法的加密解密
随着Internet的迅速发展,电子商务的浪潮势不可挡,日常工作和数据传输都放在Internet网上进行传输,大大提高了效率,降低了成本,创造了良好的效益。但是,由于 Internet网络协议本身存在着重要的安全问题(IP包本身并不继承任何安全特性,很容易伪造出IP包的地址、修改其内容、重播以前的包以及在传输途中拦截并查看包的内容),使网上的信息传输存在巨大的安全风险电子商务的安全问题也越来越突出。加密是电子商务中最主要的安全技术,加密方法的选取直接影响电子商务活动中信息的安全程度,在电子商务系统中,主要的安全问题都可以通过加密来解决。数据的保密性可通过不同的加密算法对数据加密来实现。
对我国来讲,虽然可以引进很多的外国设备,但加密设备不能依靠引进,因为它涉及到网络安全、国家机密信息的安全,所以必须自己研制。当前国际上有许多加密算法,其中DES(Data Encryption Standard)是发明最早的用得最广泛的分组对称加密算法,DES用56位蜜钥加密64位明文,输出64位密文,DES的56位密钥共有256种可能的密钥,但历史上曾利用穷举攻击破解过DES密钥,1998年电子边境基金会(EFF)用25万美元制造的专用计算机,用56小时破解了DES的密钥,1999年,EFF用22小时完成了破解工作,使DES算法受到了严重打击,使它的安全性受到严重威胁。因为JAVA语言的安全性和网络处理能力较强,本文主要介绍使用IDEA(Internation Data Encryption Algorithm)数据加密算法在Java环境下实现数据的安全传输。
IDEA数据加密算法是由中国学者来学嘉博士和著名的密码专家 James L. Massey于1990年联合提出的。它的明文和密文都是64比特,但密钥长为128比特。IDEA是作为迭代的分组密码实现的,使用 128位的密钥和 8个循环。这比 DES提供了更多的安全性,但是在选择用于 IDEA的密钥时,应该排除那些称为“弱密钥”的密钥。DES只有四个弱密钥和 12个次弱密钥,而 IDEA中的弱密钥数相当可观,有 2的 51次方个。但是,如果密钥的总数非常大,达到 2的 128次方个,那么仍有 2的 77次方个密钥可供选择。IDEA被认为是极为安全的。使用 128位的密钥,蛮力攻击中需要进行的测试次数与 DES相比会明显增大,甚至允许对弱密钥测试。而且,它本身也显示了它尤其能抵抗专业形式的分析性攻击。
二、Java密码体系和Java密码扩展
Java是Sun公司开发的一种面向对象的编程语言,并且由于它的平台无关性被大量应用于Internet的开发。Java密码体系(JCA)和Java密码扩展(JCE)的设计目的是为Java提供与实现无关的加密函数API。它们都用factory方法来创建类的例程,然后把实际的加密函数委托给提供者指定的底层引擎,引擎中为类提供了服务提供者接口在Java中实现数据的加密/解密,是使用其内置的JCE(Java加密扩展)来实现的。Java开发工具集1.1为实现包括数字签名和信息摘要在内的加密功能,推出了一种基于供应商的新型灵活应用编程接口。Java密码体系结构支持供应商的互操作,同时支持硬件和软件实现。Java密码学结构设计遵循两个原则:(1)算法的独立性和可靠性。(2)实现的独立性和相互作用性。算法的独立性是通过定义密码服务类来获得。用户只需了解密码算法的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来设置定义一个提供器。Java运行环境Sun版本时,提供一个缺省的提供器Sun。
void idea_enc( int data11[],/*待加密的64位数据首地址*/ int key1[]){
for( i= 0; i< 48; i+= 6){/*进行8轮循环*/
for(int j=0,box=i; j<6; j++,box++){
tmp= data11[1];/*交换中间两个*/
tmp= data11[1];/*最后一轮不交换*/
data11[0]= MUL(data11[0],key1[48]);
data11[1]=(char)((data11[1]+ key1[49])%0x10000);
data11[2]=(char)((data11[2]+ key1[50])%0x10000);
data11[3]= MUL(data11[3],key1[51]);
void key_decryExp(int outkey[])/*解密密钥的变逆处理*/
tmpkey[i]= outkey[ wz_spkey[i] ];/*换位*/
outkey[wz_spaddrever[i]]=(char)(65536-outkey[wz_spaddrever[i]]);/*替换成加法逆*/
outkey[wz_spmulrevr[i]]=(char)(mulInv(outkey[wz_spmulrevr[i]]));/*替换成乘法逆*/
在实际应用中,我们可以使用Java开发工具包(JDK)中内置的对Socket通信的支持,通过JCE中的Java流和链表,加密基于Socket的网络通信.我们知道,加密/解密是数据传输中保证数据完整性的常用方法,Java语言因其平台无关性,在Internet上的应用非常之广泛.使用Java实现基于IDEA的数据加密传输可以在不同的平台上实现并具有实现简洁、安全性强等优点。
三、如何用Java进行3DES加密解密
3DES加密解密的核心在于其算法设计。3DES即Triple DES,是一种基于DES算法的加密方法。其主要特点是使用三个不同的密钥,通过三次DES加密过程实现更高的安全性。
在Java中,3DES加密解密的实现步骤如下:
1.首先定义加密算法为"DESede"。
2.使用SecretKeySpec生成密钥,密钥长度为24字节。
3.创建Cipher实例,并初始化为加密或解密模式。
4.使用doFinal方法进行加密或解密操作。
下面是一个具体的3DES加密解密Java代码示例:
import java.security.Security;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
private static final String Algorithm="DESede";
public static byte[] encryptMode(byte[] keybyte, byte[] src){
SecretKey deskey= new SecretKeySpec(keybyte, Algorithm);
Cipher c1= Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
public static byte[] decryptMode(byte[] keybyte, byte[] src){
SecretKey deskey= new SecretKeySpec(keybyte, Algorithm);
Cipher c1= Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE, deskey);
public static String byte2Hex(byte[] b){
for(int n= 0; n< b.length; n++){
stmp=(Integer.toHexString(b[n]& 0XFF));
public static void main(String[] args){
Security.addProvider(new com.sun.crypto.provider.SunJCE());
final byte[] keyBytes={0x11, 0x22, 0x4F, 0x58,(byte) 0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,(byte) 0xCB,(byte) 0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,(byte) 0x98, 0x30, 0x40, 0x36,(byte) 0xE2};
String szSrc="This is a 3DES test.测试";
System.out.println("加密前的字符串:"+ szSrc);
byte[] encoded= encryptMode(keyBytes, szSrc.getBytes());
System.out.println("加密后的字符串:"+ new String(encoded));
byte[] srcBytes= decryptMode(keyBytes, encoded);
System.out.println("解密后的字符串:"+(new String(srcBytes)));
在这个示例中,我们使用了一个24字节的密钥进行加密和解密操作。
通过上述代码,我们可以实现3DES加密和解密功能。