您的位置:首页 > 其它

信息安全第一次作业,AES CBC加密,RSA密钥签名

2013-05-02 16:07 477 查看
package com.yelbosh.first;

import it.sauronsoftware.base64.Base64;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

public class AESOperator {

/*

* 加密用的Key 可以用26个字母和数字组成

* 此处使用AES-128-CBC加密模式,key需要为16位。

*/

private String sKey="0123456789abcdef";

private String ivParameter="0123456789abcdef";

private static AESOperator instance=null;

private AESOperator(){

}

public static AESOperator getInstance(){

if (instance == null)

instance = new AESOperator();

return instance;

}

// 加密

public String encrypt(String sSrc) throws Exception {

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

byte[] raw = sKey.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));

return new String(Base64.encode(encrypted));//此处使用BASE64做转码。

}

// 解密

public String decrypt(String sSrc) throws Exception {

try {

byte[] raw = sKey.getBytes("ASCII");

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

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

IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());

cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

byte[] encrypted1 = Base64.decode(sSrc.getBytes());//先用base64解密

byte[] original = cipher.doFinal(encrypted1);

String originalString = new String(original,"utf-8");

return originalString;

} catch (Exception ex) {

return null;

}

}

}

package com.yelbosh.first;

import it.sauronsoftware.base64.Base64;

import java.security.KeyPair;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

public class KeyGenerater {

private byte[] priKey;

private byte[] pubKey;

public void generater() {

try {

java.security.KeyPairGenerator keygen = java.security.KeyPairGenerator

.getInstance("RSA");

SecureRandom secrand = new SecureRandom();

secrand.setSeed("syj".getBytes()); // 初始化随机产生器

keygen.initialize(1024, secrand);

KeyPair keys = keygen.genKeyPair();

PublicKey pubkey = keys.getPublic();

PrivateKey prikey = keys.getPrivate();

pubKey = Base64.encode(pubkey.getEncoded());

priKey = Base64.encode(prikey.getEncoded());

System.out.println("成功生成密钥!");

System.out.println("pubKey = " + new String(pubKey));

System.out.println("priKey = " + new String(priKey));

} catch (java.lang.Exception e) {

System.out.println("生成密钥对失败");

e.printStackTrace();

}

}

public byte[] getPriKey() {

return priKey;

}

public byte[] getPubKey() {

return pubKey;

}

}

package com.yelbosh.first;

import it.sauronsoftware.base64.Base64;

import java.security.KeyFactory;

import java.security.PrivateKey;

import java.security.spec.PKCS8EncodedKeySpec;

public class Signaturer {

//使用私钥和明文生成发送者对该文件的签名

public static byte[] sign(byte[] priKeyText, String plainText,boolean md5) {

try {

PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64

.decode(priKeyText));

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

PrivateKey prikey = keyf.generatePrivate(priPKCS8);

// 用私钥对信息生成数字签名

java.security.Signature signet = null;

if(md5){

signet = java.security.Signature

.getInstance("MD5withRSA");

}else{

signet = java.security.Signature

.getInstance("SHA512withRSA");

}

signet.initSign(prikey);

signet.update(plainText.getBytes());

byte[] signed = Base64.encode(signet.sign());

return signed;

} catch (java.lang.Exception e) {

System.out.println("签名失败");

e.printStackTrace();

}

return null;

}

}

package com.yelbosh.first;

import it.sauronsoftware.base64.Base64;

public class SignProvider {

//使用公钥,明文,签名来验证签名是否合法

public static boolean verify(byte[] pubKeyText, String plainText,

byte[] signText,boolean md5) {

try {

// 解密由base64编码的公钥,并构造X509EncodedKeySpec对象

java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(

Base64.decode(pubKeyText));

// RSA对称加密算法

java.security.KeyFactory keyFactory = java.security.KeyFactory

.getInstance("RSA");

// 取公钥匙对象

java.security.PublicKey pubKey = keyFactory

.generatePublic(bobPubKeySpec);

// 解密由base64编码的数字签名

byte[] signed = Base64.decode(signText);

java.security.Signature signatureChecker = null;

if(md5)

signatureChecker = java.security.Signature

.getInstance("MD5withRSA");

else

signatureChecker = java.security.Signature

.getInstance("SHA512withRSA");

signatureChecker.initVerify(pubKey);

signatureChecker.update(plainText.getBytes());

// 验证签名是否正常

if (signatureChecker.verify(signed))

return true;

else

return false;

} catch (Throwable e) {

System.out.println("校验签名失败");

e.printStackTrace();

return false;

}

}

}

package com.yelbosh.first;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.Scanner;

public class Main {

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

// TODO Auto-generated method stub

System.out.println("请输入您要加密的文件的路径:\n");

Scanner scanner = new Scanner(System.in);

String fpath = scanner.next();

File file = new File(fpath);

FileReader fReader = new FileReader(file);

char[] tmp = new char[(int) file.length()];

fReader.read(tmp);

//读取的明文!!!!!!!!!!!

String content = new String(tmp);

//System.out.println(content);

System.out.println("文件读取中……");

Thread.currentThread().sleep(500);

System.out.println("文件读取完毕!");

Thread.currentThread().sleep(500);

System.out.println("按任意键对文件进行AES的CBC模式加密:\n");

scanner.next();

AESOperator aesoptr = AESOperator.getInstance();

long lStart = System.currentTimeMillis();

String step1Str = aesoptr.encrypt(content);

long lUseTime = System.currentTimeMillis() - lStart;

//System.out.println(step1Str);

System.out.println("加密完成!耗时:" + lUseTime+"ms");

FileWriter fWriter = new FileWriter("./step1.txt");

fWriter.write(step1Str);

fWriter.flush();

fWriter.close();

Thread.currentThread().sleep(500);

System.out.println("密文成功写入当前目录下step1.txt文件中!");

Thread.currentThread().sleep(500);

System.out.println("按任意键对密文进行公钥签名:\n");

scanner.next();

System.out.println("选择hash算法:");

System.out.println("1.MD5\n2.SHA512");

boolean md5 = (scanner.nextInt()==1?true:false);

KeyGenerater keyGen = new KeyGenerater();

keyGen.generater();

fWriter = new FileWriter("./step2PubKey.txt");

fWriter.write(new String(keyGen.getPubKey()));

fWriter.flush();

fWriter.close();

System.out.println("公钥成功写入当前目录下step2PubKey.txt文件中!");

Thread.currentThread().sleep(500);

fWriter = new FileWriter("./step2PriKey.txt");

fWriter.write(new String(keyGen.getPriKey()));

fWriter.flush();

fWriter.close();

System.out.println("私钥成功写入当前目录下step2PriKey.txt文件中!");

Thread.currentThread().sleep(500);

System.out.println("按任意键对密文生成签名:\n");

scanner.next();

byte[] sig = Signaturer.sign(keyGen.getPriKey(), step1Str, md5);

Thread.currentThread().sleep(500);

fWriter = new FileWriter("./step2Sig.txt");

fWriter.write(new String(sig));

fWriter.flush();

fWriter.close();

System.out.println("签名成功!成功写入当前目录下step2Sig.txt文件中!");

Thread.currentThread().sleep(1000);

System.out.println("让我们来验证与解密一下吧!");

Thread.currentThread().sleep(500);

System.out.println("签名验证中……");

Thread.currentThread().sleep(500);

if(SignProvider.verify(keyGen.getPubKey(), step1Str, sig, md5))

System.out.println("验证通过!");

Thread.currentThread().sleep(500);

System.out.println("解密中……");

Thread.currentThread().sleep(500);

long lStart2 = System.currentTimeMillis();

String step3Str = aesoptr.decrypt(step1Str);

long lUseTime2 = System.currentTimeMillis() - lStart2;

//System.out.println(step1Str);

System.out.println("解密完成!耗时:" + lUseTime2+"ms");

System.out.println("明文为:"+step3Str);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐