文件加密解密

代碼參考: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;

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 一、 1、請用Java寫一個冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨云閱讀 1,421評論 0 6
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,839評論 0 11
  • 你是否有過這樣的疑惑: “明明掌握了很多營銷方法、文案技巧,但作出的方案仍漏洞百出” “即使剛剛學習了某種方法,但...
    商務拓展閱讀 555評論 0 0