導航:首頁 > 編程語言 > java加密解密工具

java加密解密工具

發布時間:2022-08-29 16:47:28

Ⅰ 有什麼好的java加密解密方法,求共享

下面是我的一個工具類,你看下:


packagecom.sojson.common.utils;

importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.security.SecureRandom;

importjavax.crypto.Cipher;
importjavax.crypto.KeyGenerator;
importjavax.crypto.SecretKey;
importjavax.crypto.SecretKeyFactory;
importjavax.crypto.spec.DESKeySpec;
/**
*
*開發公司:SOJSON在線工具<p>
*版權所有:©www.sojson.com
*博客地址:http://www.sojson.com/blog/
*<p>
*
*注釋寫這里
*
*<p>
*
*區分責任人日期說明<br/>
*創建周柏成2017年3月13日<br/>
*
*@authorzhou-cheng
*@[email protected]
*@version1.0,2015年1月18日<br/>
*
*/
publicclassEncrypt{
publicstaticfinalStringgetMD5(Stringtext){
//returntext;
byte[]intext=text.getBytes();
MessageDigestmd5=null;
try{
md5=MessageDigest.getInstance("MD5");
}catch(NoSuchAlgorithmExceptione){
thrownewRuntimeException(e);
}
byte[]md5rslt=md5.digest(intext);
StringBufferverifyMsg=newStringBuffer();
for(inti=0;i<md5rslt.length;i++){
inthexChar=0xFF&md5rslt[i];
StringhexString=Integer.toHexString(hexChar);
hexString=(hexString.length()==1)?"0"+hexString:hexString;
verifyMsg.append(hexString);
}
returnverifyMsg.toString().toLowerCase();
}

publicstaticbyte[]key={-42,1,25,25,-57,84,67,32};

staticbyte[]encrypt(byte[]data,byte[]b)throwsException{
DESKeySpecdks=newDESKeySpec(b);
SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
SecretKeykey=keyFactory.generateSecret(dks);
SecureRandomsr=newSecureRandom();
Ciphercipher=Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE,key,sr);
byte[]encryptedData=cipher.doFinal(data);
returnencryptedData;
}

staticbyte[]decrypt(byte[]data,byte[]b)throwsException{
DESKeySpecdks=newDESKeySpec(b);
SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
SecretKeykey=keyFactory.generateSecret(dks);
SecureRandomsr=newSecureRandom();
Ciphercipher=Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE,key,sr);
byte[]decryptedData=cipher.doFinal(data);
returndecryptedData;
}

staticbyte[]getKey()throwsException{
SecureRandomsr=newSecureRandom();
KeyGeneratorkg=KeyGenerator.getInstance("DES");
kg.init(sr);
SecretKeykey=kg.generateKey();
byte[]b=key.getEncoded();
returnb;
}

publicstaticStringshortUrl(Stringurl,intrandom){
//可以自定義生成MD5加密字元傳前的混合KEY
Stringkey="gohome";
//要使用生成URL的字元
String[]chars=newString[]{"a","b","c","d","e","f","g","h",
"i","j","k","l","m","n","o","p","q","r","s","t",
"u","v","w","x","y","z","0","1","2","3","4","5",
"6","7","8","9","A","B","C","D","E","F","G","H",
"I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"};

//對傳入網址進行MD5加密
StringsMD5EncryptResult=getMD5(key+url);
Stringhex=sMD5EncryptResult;
String[]resUrl=newString[4];
for(inti=0;i<4;i++){
//把加密字元按照8位一組16進制與0x3FFFFFFF進行位與運算
StringsTempSubString=hex.substring(i*8,i*8+8);
//這里需要使用long型來轉換,因為Inteper.parseInt()只能處理31位,首位為符號位,如果不用
//long,則會越界
longlHexLong=0x3FFFFFFF&Long.parseLong(sTempSubString,16);
StringoutChars="";
for(intj=0;j<6;j++){
//把得到的值與0x0000003D進行位與運算,取得字元數組chars索引
longindex=0x0000003D&lHexLong;
//把取得的字元相加
outChars+=chars[(int)index];
//每次循環按位右移5位
lHexLong=lHexLong>>5;
}
//把字元串存入對應索引的輸出數組
resUrl[i]=outChars;
}
returnresUrl[random];
}

//6位短連接
publicstaticStringshortUrl(Stringurl){
//可以自定義生成MD5加密字元傳前的混合KEY
Stringkey=String.valueOf(System.currentTimeMillis());
//要使用生成URL的字元
String[]chars=newString[]{"a","b","c","d","e","f","g","h",
"i","j","k","l","m","n","o","p","q","r","s","t",
"u","v","w","x","y","z","0","1","2","3","4","5",
"6","7","8","9","A","B","C","D","E","F","G","H",
"I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"

};
//對傳入網址進行MD5加密
StringsMD5EncryptResult=getMD5(key+url);
Stringhex=sMD5EncryptResult;
StringresUrl="";
//把加密字元按照8位一組16進制與0x3FFFFFFF進行位與運算
StringsTempSubString=hex.substring(0*8,0*8+8);
//這里需要使用long型來轉換,因為Inteper.parseInt()只能處理31位,首位為符號位,如果不用
//long,則會越界
longlHexLong=0x3FFFFFFF&Long.parseLong(sTempSubString,16);
StringoutChars="";
for(intj=0;j<6;j++){
//把得到的值與0x0000003D進行位與運算,取得字元數組chars索引
longindex=0x0000003D&lHexLong;
//把取得的字元相加
outChars+=chars[(int)index];
//每次循環按位右移5位
lHexLong=lHexLong>>5;
}
//把字元串存入對應索引的輸出數組
resUrl=outChars;
returnresUrl;
}

/**
*方法描述:md5簽名
*
*@paramsrc
*@return
*@throwsException
*/
publicstaticStringmd5Digest(Stringsrc)throwsException{
MessageDigestmd=MessageDigest.getInstance("MD5");
byte[]b=md.digest(src.getBytes("UTF-8"));
returnbyte2HexStr(b);
}

/**
*位元組數組轉化為大寫16進制字元串
*
*@paramb
*@return
*/
publicstaticStringbyte2HexStr(byte[]b){
StringBuildersb=newStringBuilder();
for(inti=0;i<b.length;i++){
Strings=Integer.toHexString(b[i]&0xFF);
if(s.length()==1){
sb.append("0");
}
sb.append(s.toUpperCase());
}
returnsb.toString();
}

}

Ⅱ 如何使用JAVA實現對字元串的DES加密和解密

java加密字元串可以使用des加密演算法,實例如下:
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
/**
* 加密解密
*
* @author shy.qiu
* @since http://blog.csdn.net/qiushyfm
*/
public class CryptTest {
/**
* 進行MD5加密
*
* @param info
* 要加密的信息
* @return String 加密後的字元串
*/
public String encryptToMD5(String info) {
byte[] digesta = null;
try {
// 得到一個md5的消息摘要
MessageDigest alga = MessageDigest.getInstance("MD5");
// 添加要進行計算摘要的信息
alga.update(info.getBytes());
// 得到該摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 將摘要轉為字元串
String rs = byte2hex(digesta);
return rs;
}
/**
* 進行SHA加密
*
* @param info
* 要加密的信息
* @return String 加密後的字元串
*/
public String encryptToSHA(String info) {
byte[] digesta = null;
try {
// 得到一個SHA-1的消息摘要
MessageDigest alga = MessageDigest.getInstance("SHA-1");
// 添加要進行計算摘要的信息
alga.update(info.getBytes());
// 得到該摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 將摘要轉為字元串
String rs = byte2hex(digesta);
return rs;
}
// //////////////////////////////////////////////////////////////////////////
/**
* 創建密匙
*
* @param algorithm
* 加密演算法,可用 DES,DESede,Blowfish
* @return SecretKey 秘密(對稱)密鑰
*/
public SecretKey createSecretKey(String algorithm) {
// 聲明KeyGenerator對象
KeyGenerator keygen;
// 聲明 密鑰對象
SecretKey deskey = null;
try {
// 返回生成指定演算法的秘密密鑰的 KeyGenerator 對象
keygen = KeyGenerator.getInstance(algorithm);
// 生成一個密鑰
deskey = keygen.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 返回密匙
return deskey;
}
/**
* 根據密匙進行DES加密
*
* @param key
* 密匙
* @param info
* 要加密的信息
* @return String 加密後的信息
*/
public String encryptToDES(SecretKey key, String info) {
// 定義 加密演算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密隨機數生成器 (RNG),(可以不寫)
SecureRandom sr = new SecureRandom();
// 定義要生成的密文
byte[] cipherByte = null;
try {
// 得到加密/解密器
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());
} catch (Exception e) {
e.printStackTrace();
}
// 返回密文的十六進制形式
return byte2hex(cipherByte);
}
/**
* 根據密匙進行DES解密
*
* @param key
* 密匙
* @param sInfo
* 要解密的密文
* @return String 返回解密後信息
*/
public String decryptByDES(SecretKey key, String sInfo) {
// 定義 加密演算法,
String Algorithm = "DES";
// 加密隨機數生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密鑰和模式初始化Cipher對象
c1.init(Cipher.DECRYPT_MODE, key, sr);
// 對要解密的內容進行編碼處理
cipherByte = c1.doFinal(hex2byte(sInfo));
} catch (Exception e) {
e.printStackTrace();
}
// return byte2hex(cipherByte);
return new String(cipherByte);
}
// /////////////////////////////////////////////////////////////////////////////
/**
* 創建密匙組,並將公匙,私匙放入到指定文件中
*
* 默認放入mykeys.bat文件中
*/
public void createPairKey() {
try {
// 根據特定的演算法一個密鑰對生成器
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
// 加密隨機數生成器 (RNG)
SecureRandom random = new SecureRandom();
// 重新設置此隨機對象的種子
random.setSeed(1000);
// 使用給定的隨機源(和默認的參數集合)初始化確定密鑰大小的密鑰對生成器
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) {
e.printStackTrace();
}
}
/**
* 利用私匙對信息進行簽名 把簽名後的信息放入到指定的文件中
*
* @param info
* 要簽名的信息
* @param signfile
* 存入的文件
*/
public void signToInfo(String info, String signfile) {
// 從文件當中讀取私匙
PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
// 從文件中讀取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);
try {
// Signature 對象可用來生成和驗證數字簽名
Signature signet = Signature.getInstance("DSA");
// 初始化簽署簽名的私鑰
signet.initSign(myprikey);
// 更新要由位元組簽名或驗證的數據
signet.update(info.getBytes());
// 簽署或驗證所有更新位元組的簽名,返回簽名
byte[] signed = signet.sign();
// 將數字簽名,公匙,信息放入文件中
doObjToFile(signfile, new Object[] { signed, mypubkey, info });
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 讀取數字簽名文件 根據公匙,簽名,信息驗證信息的合法性
*
* @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);
try {
// 初始一個Signature對象,並用公鑰和簽名進行驗證
Signature signetcheck = Signature.getInstance("DSA");
// 初始化驗證簽名的公鑰
signetcheck.initVerify(mypubkey);
// 使用指定的 byte 數組更新要簽名或驗證的數據
signetcheck.update(info.getBytes());
System.out.println(info);
// 驗證傳入的簽名
return signetcheck.verify(signed);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 將二進制轉化為16進制字元串
*
* @param b
* 二進制位元組數組
* @return String
*/
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
/**
* 十六進制字元串轉化為2進制
*
* @param hex
* @return
*/
public byte[] hex2byte(String hex) {
byte[] ret = new byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i < 8; i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
/**
* 將兩個ASCII字元合成一個位元組; 如:"EF"--> 0xEF
*
* @param src0
* byte
* @param src1
* byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
.byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/**
* 將指定的對象寫入指定的文件
*
* @param file
* 指定寫入的文件
* @param objs
* 要寫入的對象
*/
public void doObjToFile(String file, Object[] objs) {
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
for (int i = 0; i < objs.length; i++) {
oos.writeObject(objs[i]);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 返回在文件中指定位置的對象
*
* @param file
* 指定的文件
* @param i
* 從1開始
* @return
*/
public Object getObjFromFile(String file, int i) {
ObjectInputStream ois = null;
Object obj = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
for (int j = 0; j < i; j++) {
obj = ois.readObject();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 測試
*
* @param args
*/
public static void main(String[] args) {
CryptTest jiami = new CryptTest();
// 執行MD5加密"Hello world!"
System.out.println("Hello經過MD5:" + jiami.encryptToMD5("Hello"));
// 生成一個DES演算法的密匙
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);
// 創建公匙和私匙
jiami.createPairKey();
// 對Hello world!使用私匙進行簽名
jiami.signToInfo("Hello", "mysign.bat");
// 利用公匙對簽名進行驗證。
if (jiami.validateSign("mysign.bat")) {
System.out.println("Success!");
} else {
System.out.println("Fail!");
}
}
}

Ⅲ java實現aes加密或者解密,不用工具包的怎麼做

importjava.security.InvalidKeyException;
importjava.security.Key;
importjava.security.NoSuchAlgorithmException;

importjavax.crypto.*;
importjavax.crypto.spec.*;

/**
*
*@authorwchun
*
*AES128演算法,加密模式為ECB,填充模式為pkcs7(實際就是pkcs5)
*
*
*/
publicclassAES{

staticfinalStringalgorithmStr="AES/ECB/PKCS5Padding";

;

staticprivateCiphercipher;

staticbooleanisInited=false;

//初始化
staticprivatevoidinit()
{

//初始化keyGen
try{
keyGen=KeyGenerator.getInstance("AES");
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
keyGen.init(128);

//初始化cipher
try{
cipher=Cipher.getInstance(algorithmStr);
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(NoSuchPaddingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

isInited=true;
}

publicstaticbyte[]GenKey()
{
if(!isInited)//如果沒有初始化過,則初始化
{
init();
}
returnkeyGen.generateKey().getEncoded();
}

publicstaticbyte[]Encrypt(byte[]content,byte[]keyBytes)
{
byte[]encryptedText=null;

if(!isInited)//為初始化
{
init();
}

Keykey=newSecretKeySpec(keyBytes,"AES");

try{
cipher.init(Cipher.ENCRYPT_MODE,key);
}catch(InvalidKeyExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

try{
encryptedText=cipher.doFinal(content);
}catch(IllegalBlockSizeExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(BadPaddingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

returnencryptedText;
}

//解密為byte[]
publicstaticbyte[]DecryptToBytes(byte[]content,byte[]keyBytes)
{
byte[]originBytes=null;
if(!isInited)
{
init();
}

Keykey=newSecretKeySpec(keyBytes,"AES");

try{
cipher.init(Cipher.DECRYPT_MODE,key);
}catch(InvalidKeyExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

//解密
try{
originBytes=cipher.doFinal(content);
}catch(IllegalBlockSizeExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(BadPaddingExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

returnoriginBytes;
}
}

Ⅳ JAVA程序加密,怎麼做才安全

程序加密?你說的是代碼加密還是數據加密。我都說一下吧。

Java代碼加密:

這點因為Java是開源的,想達到完全加密,基本是不可能的,因為在反編譯的時候,雖然反編譯回來的時候可能不是您原來的代碼,但是意思是接近的,所以是不行的。

那麼怎麼增加反編譯的難度(閱讀難度),那麼可以採用多層繼承(實現)方式來解決,這樣即使反編譯出來的代碼,可讀性太差,復用性太差了。

Java數據加密:

我們一般用校驗性加密,常用的是MD5,優點是速度快,數據佔用空間小。缺點是不可逆,所以我們一般用來校驗數據有沒有被改動等。

需要可逆,可以選用base64,Unicode,缺點是沒有密鑰,安全性不高。

而我們需要可逆而且採用安全的方式是:對稱加密和非堆成加密,我們常用的有AES、DES等單密鑰和雙密鑰的方式。而且是各種語言通用的。

全部手動敲字,望採納,下面是我用Javascript方式做的一系列在線加密/解密工具:

http://www.sojson.com/encrypt.html

Ⅳ java進行3des加密傳過來的數據,php怎麼解密

<?php
/**
* 3DES加解密類
* @Author: 黎志斌
* @version: v1.0
* 2016年7月21日
*/
class Encrypt
{
//加密秘鑰,
private $_key;
private $_iv;
public function __construct($key, $iv)
{
$this->_key = $key;
$this->_iv = $iv;
}

/**
* 對字元串進行3DES加密
* @param string 要加密的字元串
* @return mixed 加密成功返回加密後的字元串,否則返回false
*/
public function encrypt3DES($str)
{
$td = mcrypt_mole_open(MCRYPT_3DES, "", MCRYPT_MODE_CBC, "");
if ($td === false) {
return false;
}
//檢查加密key,iv的長度是否符合演算法要求
$key = $this->fixLen($this->_key, mcrypt_enc_get_key_size($td));
$iv = $this->fixLen($this->_iv, mcrypt_enc_get_iv_size($td));

//加密數據長度處理
$str = $this->strPad($str, mcrypt_enc_get_block_size($td));

if (mcrypt_generic_init($td, $key, $iv) !== 0) {
return false;
}
$result = mcrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
return $result;
}

/**
* 對加密的字元串進行3DES解密
* @param string 要解密的字元串
* @return mixed 加密成功返回加密後的字元串,否則返回false
*/
public function decrypt3DES($str)
{
$td = mcrypt_mole_open(MCRYPT_3DES, "", MCRYPT_MODE_CBC, "");
if ($td === false) {
return false;
}

//檢查加密key,iv的長度是否符合演算法要求
$key = $this->fixLen($this->_key, mcrypt_enc_get_key_size($td));
$iv = $this->fixLen($this->_iv, mcrypt_enc_get_iv_size($td));

if (mcrypt_generic_init($td, $key, $iv) !== 0) {
return false;
}

$result = mdecrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);

return $this->strUnPad($result);
}

/**
* 返回適合演算法長度的key,iv字元串
* @param string $str key或iv的值
* @param int $td_len 符合條件的key或iv長度
* @return string 返回處理後的key或iv值
*/
private function fixLen($str, $td_len)
{
$str_len = strlen($str);
if ($str_len > $td_len) {
return substr($str, 0, $td_len);
} else if($str_len < $td_len) {
return str_pad($str, $td_len, '0');
}
return $str;
}

/**
* 返回適合演算法的分組大小的字元串長度,末尾使用\0補齊
* @param string $str 要加密的字元串
* @param int $td_group_len 符合演算法的分組長度
* @return string 返回處理後字元串
*/
private function strPad($str, $td_group_len)
{
$padding_len = $td_group_len - (strlen($str) % $td_group_len);
return str_pad($str, strlen($str) + $padding_len, "\0");
}

/**
* 返回適合演算法的分組大小的字元串長度,末尾使用\0補齊
* @param string $str 要加密的字元串
* @return string 返回處理後字元串
*/
private function strUnPad($str)
{
return rtrim($str);
}
}
$key = 'ABCEDFGHIJKLMNOPQ';
$iv = '0123456789';
$des = new Encrypt($key, $iv);
$str = "abcdefghijklmnopq";
echo "source: {$str},len: ",strlen($str),"\r\n";
$e_str = $des->encrypt3DES($str);
echo "entrypt: ", $e_str, "\r\n";
$d_str = $des->decrypt3DES($e_str);
echo "dntrypt: {$d_str},len: ",strlen($d_str),"\r\n";

Ⅵ 如何用JAVA實現字元串簡單加密解密

java加密字元串可以使用des加密演算法,實例如下:
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.*;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
/**
* 加密解密
*
* @author shy.qiu
* @since http://blog.csdn.net/qiushyfm
*/
public class CryptTest {
/**
* 進行MD5加密
*
* @param info
* 要加密的信息
* @return String 加密後的字元串
*/
public String encryptToMD5(String info) {
byte[] digesta = null;
try {
// 得到一個md5的消息摘要
MessageDigest alga = MessageDigest.getInstance("MD5");
// 添加要進行計算摘要的信息
alga.update(info.getBytes());
// 得到該摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 將摘要轉為字元串
String rs = byte2hex(digesta);
return rs;
}
/**
* 進行SHA加密
*
* @param info
* 要加密的信息
* @return String 加密後的字元串
*/
public String encryptToSHA(String info) {
byte[] digesta = null;
try {
// 得到一個SHA-1的消息摘要
MessageDigest alga = MessageDigest.getInstance("SHA-1");
// 添加要進行計算摘要的信息
alga.update(info.getBytes());
// 得到該摘要
digesta = alga.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 將摘要轉為字元串
String rs = byte2hex(digesta);
return rs;
}
// //////////////////////////////////////////////////////////////////////////
/**
* 創建密匙
*
* @param algorithm
* 加密演算法,可用 DES,DESede,Blowfish
* @return SecretKey 秘密(對稱)密鑰
*/
public SecretKey createSecretKey(String algorithm) {
// 聲明KeyGenerator對象
KeyGenerator keygen;
// 聲明 密鑰對象
SecretKey deskey = null;
try {
// 返回生成指定演算法的秘密密鑰的 KeyGenerator 對象
keygen = KeyGenerator.getInstance(algorithm);
// 生成一個密鑰
deskey = keygen.generateKey();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 返回密匙
return deskey;
}
/**
* 根據密匙進行DES加密
*
* @param key
* 密匙
* @param info
* 要加密的信息
* @return String 加密後的信息
*/
public String encryptToDES(SecretKey key, String info) {
// 定義 加密演算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密隨機數生成器 (RNG),(可以不寫)
SecureRandom sr = new SecureRandom();
// 定義要生成的密文
byte[] cipherByte = null;
try {
// 得到加密/解密器
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());
} catch (Exception e) {
e.printStackTrace();
}
// 返回密文的十六進制形式
return byte2hex(cipherByte);
}
/**
* 根據密匙進行DES解密
*
* @param key
* 密匙
* @param sInfo
* 要解密的密文
* @return String 返回解密後信息
*/
public String decryptByDES(SecretKey key, String sInfo) {
// 定義 加密演算法,
String Algorithm = "DES";
// 加密隨機數生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try {
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密鑰和模式初始化Cipher對象
c1.init(Cipher.DECRYPT_MODE, key, sr);
// 對要解密的內容進行編碼處理
cipherByte = c1.doFinal(hex2byte(sInfo));
} catch (Exception e) {
e.printStackTrace();
}
// return byte2hex(cipherByte);
return new String(cipherByte);
}
// /////////////////////////////////////////////////////////////////////////////
/**
* 創建密匙組,並將公匙,私匙放入到指定文件中
*
* 默認放入mykeys.bat文件中
*/
public void createPairKey() {
try {
// 根據特定的演算法一個密鑰對生成器
KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");
// 加密隨機數生成器 (RNG)
SecureRandom random = new SecureRandom();
// 重新設置此隨機對象的種子
random.setSeed(1000);
// 使用給定的隨機源(和默認的參數集合)初始化確定密鑰大小的密鑰對生成器
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) {
e.printStackTrace();
}
}
/**
* 利用私匙對信息進行簽名 把簽名後的信息放入到指定的文件中
*
* @param info
* 要簽名的信息
* @param signfile
* 存入的文件
*/
public void signToInfo(String info, String signfile) {
// 從文件當中讀取私匙
PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);
// 從文件中讀取公匙
PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);
try {
// Signature 對象可用來生成和驗證數字簽名
Signature signet = Signature.getInstance("DSA");
// 初始化簽署簽名的私鑰
signet.initSign(myprikey);
// 更新要由位元組簽名或驗證的數據
signet.update(info.getBytes());
// 簽署或驗證所有更新位元組的簽名,返回簽名
byte[] signed = signet.sign();
// 將數字簽名,公匙,信息放入文件中
doObjToFile(signfile, new Object[] { signed, mypubkey, info });
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 讀取數字簽名文件 根據公匙,簽名,信息驗證信息的合法性
*
* @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);
try {
// 初始一個Signature對象,並用公鑰和簽名進行驗證
Signature signetcheck = Signature.getInstance("DSA");
// 初始化驗證簽名的公鑰
signetcheck.initVerify(mypubkey);
// 使用指定的 byte 數組更新要簽名或驗證的數據
signetcheck.update(info.getBytes());
System.out.println(info);
// 驗證傳入的簽名
return signetcheck.verify(signed);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 將二進制轉化為16進制字元串
*
* @param b
* 二進制位元組數組
* @return String
*/
public String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
}
/**
* 十六進制字元串轉化為2進制
*
* @param hex
* @return
*/
public byte[] hex2byte(String hex) {
byte[] ret = new byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i < 8; i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
/**
* 將兩個ASCII字元合成一個位元組; 如:"EF"--> 0xEF
*
* @param src0
* byte
* @param src1
* byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 }))
.byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 }))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;
}
/**
* 將指定的對象寫入指定的文件
*
* @param file
* 指定寫入的文件
* @param objs
* 要寫入的對象
*/
public void doObjToFile(String file, Object[] objs) {
ObjectOutputStream oos = null;
try {
FileOutputStream fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
for (int i = 0; i < objs.length; i++) {
oos.writeObject(objs[i]);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 返回在文件中指定位置的對象
*
* @param file
* 指定的文件
* @param i
* 從1開始
* @return
*/
public Object getObjFromFile(String file, int i) {
ObjectInputStream ois = null;
Object obj = null;
try {
FileInputStream fis = new FileInputStream(file);
ois = new ObjectInputStream(fis);
for (int j = 0; j < i; j++) {
obj = ois.readObject();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return obj;
}
/**
* 測試
*
* @param args
*/
public static void main(String[] args) {
CryptTest jiami = new CryptTest();
// 執行MD5加密"Hello world!"
System.out.println("Hello經過MD5:" + jiami.encryptToMD5("Hello"));
// 生成一個DES演算法的密匙
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);
// 創建公匙和私匙
jiami.createPairKey();
// 對Hello world!使用私匙進行簽名
jiami.signToInfo("Hello", "mysign.bat");
// 利用公匙對簽名進行驗證。
if (jiami.validateSign("mysign.bat")) {
System.out.println("Success!");
} else {
System.out.println("Fail!");
}
}
}

Ⅶ 如何用java實現文件(不只是txt文本)的整體加密解密

importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.security.KeyPair;
importjava.security.KeyPairGenerator;
importjava.security.NoSuchAlgorithmException;
importjava.security.interfaces.RSAPrivateKey;
importjava.security.interfaces.RSAPublicKey;
importjavax.crypto.Cipher;

/**
*文件加密解密
*加解密需要依靠以下四個屬性,
;
staticKeyPairkeyPair;
staticRSAPrivateKeyprivateKey;
staticRSAPublicKeypublicKey;
*@authoryoung
*
*/
publicclassRSAEncrypt{

;

staticKeyPairkeyPair;

staticRSAPrivateKeyprivateKey;

staticRSAPublicKeypublicKey;

static{
try{
//實例類型
keyPairGen=KeyPairGenerator.getInstance("RSA");
//初始化長度
keyPairGen.initialize(512);
//聲場KeyPair
keyPair=keyPairGen.generateKeyPair();
//Generatekeys
privateKey=(RSAPrivateKey)keyPair.getPrivate();
publicKey=(RSAPublicKey)keyPair.getPublic();
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}

publicstaticvoidmain(String[]args){
RSAEncryptencrypt=newRSAEncrypt();
Filefile=newFile(
"C:\DocumentsandSettings\Administrator.DCB5E0D91E0D436\桌面\sdf.txt");
FilenewFile=newFile(
"C:\DocumentsandSettings\Administrator.DCB5E0D91E0D436\桌面\sdf1.txt");
encrypt.encryptFile(encrypt,file,newFile);
Filefile1=newFile(
"C:\DocumentsandSettings\Administrator.DCB5E0D91E0D436\桌面\sdf1.txt");
FilenewFile1=newFile(
"C:\DocumentsandSettings\Administrator.DCB5E0D91E0D436\桌面\sdf2.txt");
encrypt.decryptFile(encrypt,file1,newFile1);
}

/**
*加密文件
*@paramencryptRSAEncrypt對象
*@paramfile源文件
*@paramnewFile目標文件
*/
publicvoidencryptFile(RSAEncryptencrypt,Filefile,FilenewFile){
try{
InputStreamis=newFileInputStream(file);
OutputStreamos=newFileOutputStream(newFile);

byte[]bytes=newbyte[53];
while(is.read(bytes)>0){
byte[]e=encrypt.encrypt(RSAEncrypt.publicKey,bytes);
bytes=newbyte[53];
os.write(e,0,e.length);
}
os.close();
is.close();
System.out.println("writesuccess");
}catch(Exceptione){
e.printStackTrace();
}
}

/**
*解密文件
*@paramencryptRSAEncrypt對象
*@paramfile
*@paramnewFile
*/
publicvoiddecryptFile(RSAEncryptencrypt,Filefile,FilenewFile){
try{
InputStreamis=newFileInputStream(file);
OutputStreamos=newFileOutputStream(newFile);
byte[]bytes1=newbyte[64];
while(is.read(bytes1)>0){
byte[]de=encrypt.decrypt(RSAEncrypt.privateKey,bytes1);
bytes1=newbyte[64];
os.write(de,0,de.length);
}
os.close();
is.close();
System.out.println("writesuccess");

}catch(Exceptione){
e.printStackTrace();
}
}

/**
*加密實現
**EncryptString.*
*
*@returnbyte[]加密後的位元組數組
*/
protectedbyte[]encrypt(RSAPublicKeypublicKey,byte[]obj){
if(publicKey!=null){
try{
Ciphercipher=Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
returncipher.doFinal(obj);
}catch(Exceptione){
e.printStackTrace();
}
}
returnnull;
}

/**
*解密實現
**Basicdecryptmethod*
*
*@returnbyte[]解密後的位元組數組
*/
protectedbyte[]decrypt(RSAPrivateKeyprivateKey,byte[]obj){
if(privateKey!=null){
try{
Ciphercipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
returncipher.doFinal(obj);
}catch(Exceptione){
e.printStackTrace();
}
}
returnnull;
}
}

Ⅷ 用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數據加密演算法

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。

三、Java環境下的實現

1.加密過程的實現

void idea_enc( int data11[], /*待加密的64位數據首地址*/ int key1[]){
int i ;
int tmp,x;
int zz[]=new int[6];
for ( i = 0 ; i < 48 ; i += 6) { /*進行8輪循環*/
for(int j=0,box=i;j<6;j++,box++){
zz[j]=key1[box];
}
x = handle_data(data11,zz);
tmp = data11[1]; /*交換中間兩個*/
data11[1] = data11[2];
data11[2] = tmp;
}
tmp = data11[1]; /*最後一輪不交換*/
data11[1] = data11[2];
data11[2] = tmp;
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]);
}

2.解密過程的實現

void key_decryExp(int outkey[])/*解密密鑰的變逆處理*/
{ int tmpkey[] = new int[52] ;
int i;
for ( i = 0 ; i < 52 ; i++) {
tmpkey[i] = outkey[ wz_spkey[i] ] ;/*換位*/
}
for ( i = 0 ; i < 52 ; i++) {
outkey[i] = tmpkey[i];
}
for ( i = 0 ; i < 18 ; i++) {
outkey[wz_spaddrever[i]] = (char)(65536-outkey[wz_spaddrever[i]]) ;/*替換成加法逆*/
}
for ( i = 0 ; i < 18 ; i++){
outkey[wz_spmulrevr[i]] =(char)(mulInv(outkey[wz_spmulrevr[i]] ));/*替換成乘法逆*/
}
}

四、總結

在實際應用中,我們可以使用Java開發工具包(JDK)中內置的對Socket通信的支持,通過JCE中的Java流和鏈表,加密基於Socket的網路通信.我們知道,加密/解密是數據傳輸中保證數據完整性的常用方法,Java語言因其平台無關性,在Internet上的應用非常之廣泛.使用Java實現基於IDEA的數據加密傳輸可以在不同的平台上實現並具有實現簡潔、安全性強等優點。

Ⅸ 使用eclipse做一個java工具類,來實現對文件和文字的加密解密怎麼做呢使用什麼加密演算法,求解答!

http://blog.csdn.net/stpeace/article/details/8294980 可以看看這個

閱讀全文

與java加密解密工具相關的資料

熱點內容
卸載聯想app哪個好 瀏覽:719
php文字轉圖片 瀏覽:328
豆客後台怎麼加密碼 瀏覽:574
jpg轉換pdf破解版 瀏覽:978
php基礎書籍推薦 瀏覽:775
伺服器與外網不通如何驗證 瀏覽:351
電子版是不是就是文件夾 瀏覽:50
游戲屬性文件加密 瀏覽:462
如何讓安卓手機桌面圖標下移 瀏覽:528
ubuntuphp5環境搭建 瀏覽:99
賭癮解壓視頻 瀏覽:917
晉城移動dns伺服器地址 瀏覽:294
php開源文庫系統 瀏覽:134
android記事本源碼 瀏覽:407
安卓11小游戲怎麼玩法 瀏覽:190
gif有損壓縮 瀏覽:937
windows下安裝linux命令操作 瀏覽:844
米家app怎麼設置進門亮燈 瀏覽:652
任我行伺服器為什麼會影響截圖 瀏覽:296
安卓留言板怎麼刪除 瀏覽:18