文件加密解密

代码参考:http://www.apkbus.com/forum.php?mod=viewthread&tid=52121&ordertype=1

核心代码如下:

public class SymEncrypt {

/**

* 获得key

* @param arrBTmp 秘钥字节

* @param alg加密方式名称

* @return

*/

public static Key getKey(byte[] arrBTmp, String alg){

if(!(alg.equals("DES")||alg.equals("DESede")||alg.equals("AES"))){

System.out.println("alg type not find: "+alg);

return null;

}

byte[] arrB;

if(alg.equals("DES")){

arrB = new byte[8];

}

else if(alg.equals("DESede")){

arrB = new byte[24];

}

else{

arrB = new byte[16];

}

int i=0;

int j=0;

while(i < arrB.length){

if(j>arrBTmp.length-1){

j=0;

}

arrB[i] = arrBTmp[j];

i++;

j++;

}

Key key = new javax.crypto.spec.SecretKeySpec(arrB, alg);

return key;

}

/**

* 加密

* @param s 文件字符串

* @param strKey密钥字符串

* @param alg 加密方式

* @return

*/

public static byte[] encrypt(String s,String strKey,String alg){

if(!(alg.equals("DES")||alg.equals("DESede")||alg.equals("AES"))){

System.out.println("alg type not find: "+alg);

return null;

}

byte[] r=null;

try {

Key key = getKey(strKey.getBytes(),alg);

Cipher c;

c = Cipher.getInstance(alg);

c.init(Cipher.ENCRYPT_MODE, key);

r = c.doFinal(s.getBytes());

//System.out.println("加密后的二进串:" + FileDigest.byte2Str(r));

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeyException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (BadPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return r;

}

/**

* 解密

* @param code 文件字节

* @param strKey 密钥

* @param alg 加密方式

* @return

*/

public static String decrypt(byte[] code,String strKey,String alg){

if(!(alg.equals("DES")||alg.equals("DESede")||alg.equals("AES"))){

System.out.println("alg type not find: "+alg);

return null;

}

String r=null;

try {

Key key = getKey(strKey.getBytes(),alg);

Cipher c;

c = Cipher.getInstance(alg);

c.init(Cipher.DECRYPT_MODE,key);

byte[] clearByte=c.doFinal(code);

r=new String(clearByte);

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchPaddingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvalidKeyException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (BadPaddingException e) {

// TODO Auto-generated catch block

System.out.println("not padding");

r=null;

}

//System.out.println("解密后的信息:"+r);

return r;

}

}

文件签名如下:

public class RsaVerify {

/**

* 生成密钥

* @param size  长度

* @param prifile私钥

* @param pubfile公钥

* @return

*/

public static boolean creatKey(int size, String prifile, String pubfile) {

if ((new java.io.File(prifile)).exists() == false && (new java.io.File(pubfile)).exists() == false) {

if (generatekey(size, prifile, pubfile) == false) {

return false;

} else

return true;

} else

return false;

}

/**

*

* @param s

*                源文件

* @param prifile

*                秘钥文件

* @param sign

*                目标文件

* @return

*/

public static boolean sign(String s, String prifile, String sign) {

boolean r = false;

try {

java.io.ObjectInputStream in = new java.io.ObjectInputStream(new java.io.FileInputStream(

prifile));

PrivateKey myprikey = (PrivateKey) in.readObject();

in.close();

Signature signet = Signature.getInstance("SHA1WithRSA");

signet.initSign(myprikey);

signet.update(s.getBytes());

byte[] signed = signet.sign();

// System.out.println("signed(签名内容)="+FileDigest.byte2Str(signed));

java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(new java.io.FileOutputStream(

sign));

out.writeObject(signed);

out.close();

r = true;

// System.out.println("签名并生成文件成功");

} catch (java.lang.Exception e) {

e.printStackTrace();

// System.out.println("签名并生成文件失败");

r = false;

}

return r;

}

/**

* 签名验证

* @param s 源文件

* @param pubfile  公钥文件

* @param sign  签名文件

* @return

*/

public static boolean checkSign(String s, String pubfile, String sign) {

boolean r = false;

try {

java.io.ObjectInputStream in = new java.io.ObjectInputStream(new java.io.FileInputStream(

pubfile));

PublicKey pubkey = (PublicKey) in.readObject();

in.close();

// System.out.println(pubkey.getFormat());

in = new java.io.ObjectInputStream(new java.io.FileInputStream(sign));

byte[] signed = (byte[]) in.readObject();

in.close();

Signature signetcheck = Signature.getInstance("SHA1WithRSA");

signetcheck.initVerify(pubkey);

signetcheck.update(s.getBytes());

if (signetcheck.verify(signed)) {

// System.out.println("info=" + s);

// System.out.println("签名正常");

r = true;

} else {

// System.out.println("非签名正常");

r = false;

}

} catch (java.lang.Exception e) {

e.printStackTrace();

System.out.println("Error: checkSign failed");

}

return r;

}

/**

* 生成密钥

* @param size 长度

* @param prifile 私钥

* @param pubfile公钥

* @return

*/

public static boolean generatekey(int size, String prifile, String pubfile) {

try {

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

keygen.initialize(size);

KeyPair keys = keygen.generateKeyPair();

PublicKey pubkey = keys.getPublic();

PrivateKey prikey = keys.getPrivate();

java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(new java.io.FileOutputStream(

prifile));

out.writeObject((Object) prikey);

out.close();

// System.out.println("写入对象 prikeys ok");

out = new java.io.ObjectOutputStream(new java.io.FileOutputStream(pubfile));

out.writeObject((Object) pubkey);

out.close();

// System.out.println("写入对象 pubkeys ok");

return true;

} catch (java.lang.Exception e) {

e.printStackTrace();

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

return false;

}

}

}

报文鉴别如下:

public class FileDigest {

/**

* SHA1报文鉴别

* @param s 资源文件

* @return 鉴别码文件

*/

public static byte[] digestSHA1(String s) {

byte[] digesta=null;

try {

MessageDigest alg = MessageDigest.getInstance("SHA-1");

alg.update(s.getBytes());

digesta = alg.digest();

}catch (NoSuchAlgorithmException e) {

System.out.println("Error: digestSHA1 failed");

}

return digesta;

}

/**

* MD5报文鉴别

* @param s 资源文件

* @return 鉴别码文件

*/

public static byte[] digestMD5(String s) {

byte[] digesta=null;

MessageDigest alg;

try {

alg = MessageDigest.getInstance("MD5");

alg.update(s.getBytes());

digesta = alg.digest();

} catch (NoSuchAlgorithmException e) {

System.out.println("Error: digestMD5 failed");

}

return digesta;

}

/**

*

* @param b 鉴别码文件

* @param s 资源文件

* @param algo

* @return

*/

public static boolean isEqual(byte[] b,String s,int algo){

MessageDigest alg;

boolean r=false;

try{

if(algo==0){

alg = MessageDigest.getInstance("MD5");

}

else{

alg = MessageDigest.getInstance("SHA-1");

}

alg.update(s.getBytes());

if (MessageDigest.isEqual(b, alg.digest())) {

r=true;

} else {

r=false;

}

}catch (NoSuchAlgorithmException e) {

System.out.println("Error: isEqual failed");

}

return r;

}

/**

* 字节到字符串

* @param b

* @return

*/

public static String byte2Str(byte[] b)

{

String str = "";

String stmp = "";

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

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

if (stmp.length() == 1)

str = str + "0" + stmp;

else

str = str + stmp;

}

return str;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,622评论 18 399
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,367评论 0 6
  • 一. Java基础部分.................................................
    wy_sure阅读 3,810评论 0 11
  • 你是否有过这样的疑惑: “明明掌握了很多营销方法、文案技巧,但作出的方案仍漏洞百出” “即使刚刚学习了某种方法,但...
    商务拓展阅读 530评论 0 0