分享
 
 
 

一个用JAVA开发的会话密钥程序

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

//package

/*

运行本程序你需要下载JCE,Bouncy Castle的JCE with Provider and Lightweight API

网止是 http://www.bouncycastle.org

配置如下:

在WINDOWS中,你需要把下载的bcprov-jdk14-119.jar文件拷贝到两个地方:

一个在你安装的JDK目录中,比如说我的是C:\j2sdk1.4.0-rc\jre\lib\ext

另一个在你的JDK运行环境中,我的是在

C:\Program Files\Java\j2re1.4.0-rc\lib\ext;

另外还要在对两个java.security进行修改:

我的在 C:\j2sdk1.4.0-rc\jre\lib\security\java.security;

C:\Program Files\Java\j2re1.4.0-rc\lib\security\java.security;

在java.security中加入 security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider

假如一切顺利,你就可以运行本程序了。

该程序具有对你的文件加解密功能。需要你指定的数据,程序中已给了接口。

比如说你指定了要加密的文件名"4.txt",加密后的文件存放位置"6.txt",

还有口令passWord如"liufeng"后,运行该程序,那么"6.txt" 中将是"4.txt"的密文。

注重口令是解密的钥匙,不要忘记。

其他解密过程自己参考。

本程序利用会话密钥加密,提供很多接口。假如你项目中需要加密过程,可以稍加改进为你所用

*/

import java.security.*;

import java.security.spec.*;

import javax.crypto.*;

import javax.crypto.spec.*;

import java.io.*;

import java.util.*;

public class FileEncryptorRSA {

private static final int ITERATIONS=1000;//计算次数,在加盐中用到

private static byte[] publicKeyBytes;//公钥

private static byte[] privateKeyBytes;//私钥

private static String SessionKey;//会话密钥

public static String ENCRYPT_PRIVATEKEY_FILE="1.txt";//该文件放置加密的私钥

private static String TEXT_FILE="4.txt";//要加密的文件

private static String ENCRPTOR_TEXT_FILE="5.txt";//被加密后的文件

private static String DENCRYPTOR_TEXT_FILE="6.txt";//解密后的文件

private static String password="liufeng";//口令用于加密私钥

public void setTEXT_FILE(String fileName){

TEXT_FILE=fileName;

}

public void setENCRYPT_PRIVATEKEY_FILE(String fileName){

ENCRYPT_PRIVATEKEY_FILE=fileName;

}

public String getENCRYPT_PRIVATEKEY_FILE(){

return ENCRYPT_PRIVATEKEY_FILE;

}

public void setENCRPTOR_TEXT_FILE(String fileName){

ENCRPTOR_TEXT_FILE=fileName;

}

public String getENCRPTOR_TEXT_FILE(){

return ENCRPTOR_TEXT_FILE;

}

public void setDENCRYPTOR_TEXT_FILE(String fileName){

DENCRYPTOR_TEXT_FILE=fileName;

}

public String getDENCRYPTOR_TEXT_FILE(){

return DENCRYPTOR_TEXT_FILE;

}

public void setPassword(String password){

this.password=password;

}

//create a RSA secretKey

public static void createKey()throws Exception{

KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");

keyPairGenerator.initialize(1024);

KeyPair keyPair=keyPairGenerator.genKeyPair();

//得到公钥的字节数组

publicKeyBytes=keyPair.getPublic().getEncoded();

//得到私钥

byte[] privateKeyBytes=keyPair.getPrivate().getEncoded();

byte[] encrytedPrivatekey=passwordEncrypt(password.toCharArray(),privateKeyBytes);

FileOutputStream fos=new FileOutputStream(ENCRYPT_PRIVATEKEY_FILE);

fos.write(encrytedPrivatekey);

fos.close();

}

//通过给的口令加密私钥

private static byte[] passwordEncrypt(char[] password,byte[] privateKeyBytes)

throws Exception{

//create 8 byte salt

byte[] salt=new byte[8];

Random random=new Random();

random.nextBytes(salt);

//create a PBE key and cipher

PBEKeySpec keySpec=new PBEKeySpec(password);

SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBEWithSHAAndTwofish-CBC");

SecretKey key=keyFactory.generateSecret(keySpec);

PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATIONS);

Cipher cipher=Cipher.getInstance("PBEWithSHAAndTwofish-CBC");

cipher.init(Cipher.ENCRYPT_MODE,key,paramSpec);

//Encrypt the byte[]

byte[] cipherPriKey=cipher.doFinal(privateKeyBytes);

//write out salt ,and then the cipherPriKey

ByteArrayOutputStream baos=new ByteArrayOutputStream();

baos.write(salt);

baos.write(cipherPriKey);

return baos.toByteArray();

}

//用会话密钥加密给定的文件,然后用公钥加密会话密钥,并存入文件中

//最后加密后的文件由密钥长度+已加密的密钥(会话密钥)+密文

public static void encrypt()throws Exception{

//转换成RSA密钥

X509EncodedKeySpec keySpec=new X509EncodedKeySpec(publicKeyBytes);

KeyFactory keyFactory=KeyFactory.getInstance("RSA");

PublicKey publickey=keyFactory.generatePublic(keySpec);

//打开存贮密文的文件

DataOutputStream output=new DataOutputStream(new FileOutputStream(ENCRPTOR_TEXT_FILE));

//创建RSA的CIpher

Cipher rsaCipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");

rsaCipher.init(Cipher.ENCRYPT_MODE,publickey);

//创建会话密钥(Rijndael)

KeyGenerator rijndaelKeyGenerator=KeyGenerator.getInstance("Rijndael");

rijndaelKeyGenerator.init(256);

Key rijndaelKey=rijndaelKeyGenerator.generateKey();

//公钥加密会话密钥

byte[] encodedKeyBytes=rsaCipher.doFinal(rijndaelKey.getEncoded());

output.writeInt(encodedKeyBytes.length);

output.write(encodedKeyBytes);

//产生IV向量

SecureRandom random=new SecureRandom();

byte[] iv=new byte[16];

random.nextBytes(iv);

output.write(iv);

//加密正文

IvParameterSpec spec=new IvParameterSpec(iv);

Cipher symmetricCipher=Cipher.getInstance("Rijndael/CBC/PKCS5Padding");

symmetricCipher.init(Cipher.ENCRYPT_MODE,rijndaelKey,spec);

CipherOutputStream cos=new CipherOutputStream(output,symmetricCipher);

FileInputStream input=new FileInputStream(TEXT_FILE);

int theByte=0;

while((theByte=input.read())!=-1){

cos.write(theByte);

}

input.close();

cos.close();

return;

}

//得到私钥

private static byte[] passwordDecrypt(char[] password,byte[] ciphertext)

throws Exception{

byte[] salt=new byte[8];

ByteArrayInputStream bais=new ByteArrayInputStream(ciphertext);

bais.read(salt,0,8);

byte[] remainingCiphertext=new byte[ciphertext.length-8];

bais.read(remainingCiphertext,0,ciphertext.length-8);

PBEKeySpec keySpec=new PBEKeySpec(password);

SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBEWithSHAAndTwofish-CBC");

SecretKey key=keyFactory.generateSecret(keySpec);

PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATIONS);

Cipher cipher=Cipher.getInstance("PBEWithSHAAndTwofish-CBC");

cipher.init(Cipher.DECRYPT_MODE,key,paramSpec);

return cipher.doFinal(remainingCiphertext);

}

//解密加密的文件

public static void decrypt()

throws Exception{

FileInputStream fis=new FileInputStream(ENCRYPT_PRIVATEKEY_FILE);

ByteArrayOutputStream baos=new ByteArrayOutputStream();

int theByte=0;

while((theByte=fis.read())!=-1){

baos.write(theByte);

}

fis.close();

//得到被加密的私钥

byte[] keyBytes=baos.toByteArray();

baos.close();

//得到私钥

byte[] sKey=passwordDecrypt(password.toCharArray(),keyBytes);

//产生RSA私钥

PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(sKey);

KeyFactory keyFactory=KeyFactory.getInstance("RSA");

PrivateKey privateKey=keyFactory.generatePrivate(keySpec);

Cipher rsaCipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");

DataInputStream dis=new DataInputStream(new FileInputStream(ENCRPTOR_TEXT_FILE));

//读密文中密码长度和密码

byte[] encryptedKeyBytes=new byte[dis.readInt()];

dis.readFully(encryptedKeyBytes);

rsaCipher.init(Cipher.DECRYPT_MODE,privateKey);

byte[] rijdaelKeyBytes=rsaCipher.doFinal(encryptedKeyBytes);

//得到会话密钥

SecretKey rijndaelKey=new SecretKeySpec(rijdaelKeyBytes,"Rijndael");

byte[] iv=new byte[16];

dis.read(iv);

IvParameterSpec spec=new IvParameterSpec(iv);

//用会话密钥解密正文

Cipher cipher=Cipher.getInstance("Rijndael/CBC/PKCS5Padding");

cipher.init(Cipher.DECRYPT_MODE,rijndaelKey,spec);

CipherInputStream cis=new CipherInputStream(dis,cipher);

FileOutputStream fos=new FileOutputStream(DENCRYPTOR_TEXT_FILE);

theByte=0;

while((theByte=cis.read())!=-1){

fos.write(theByte);

}

cis.close();

fos.close();

return;

}

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

createKey();

encrypt();

decrypt();

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有