求java中3des加密解密示例

求java中3des加密解密示例,第1张

在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:

jcejar

security/US_export_policyjar

security/local_policyjar

ext/sunjce_providerjar

Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中。对于WEB应用,不需要把这些包加到WEB-INF/lib目录下。

以下是java中调用sun公司提供的3DES加密解密算法的样本代码:

加密解密代码

import javasecuritySecurity;

import javaxcryptoCipher;

import javaxcryptoSecretKey;

import javaxcryptospecSecretKeySpec;

/字符串 DESede(3DES) 加密/

public class ThreeDes {

/

@param args在java中调用sun公司提供的3DES加密解密算法时,需要使

用到$JAVA_HOME/jre/lib/目录下如下的4个jar包:

jcejar

security/US_export_policyjar

security/local_policyjar

ext/sunjce_providerjar

/

private static final String Algorithm ="DESede"; //定义加密算法,可用 DES,DESede,Blowfish

//keybyte为加密密钥,长度为24字节

//src为被加密的数据缓冲区(源)

public static byte[] encryptMode(byte[] keybyte,byte[] src){

try {

//生成密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

//加密

Cipher c1 = CiphergetInstance(Algorithm);

c1init(CipherENCRYPT_MODE, deskey);

return c1doFinal(src);//在单一方面的加密或解密

} catch (javasecurityNoSuchAlgorithmException e1) {

// TODO: handle exception

e1printStackTrace();

}catch(javaxcryptoNoSuchPaddingException e2){

e2printStackTrace();

}catch(javalangException e3){

e3printStackTrace();

}

return null;

}

//keybyte为加密密钥,长度为24字节

//src为加密后的缓冲区

public static byte[] decryptMode(byte[] keybyte,byte[] src){

try {

//生成密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

//解密

Cipher c1 = CiphergetInstance(Algorithm);

c1init(CipherDECRYPT_MODE, deskey);

return c1doFinal(src);

} catch (javasecurityNoSuchAlgorithmException e1) {

// TODO: handle exception

e1printStackTrace();

}catch(javaxcryptoNoSuchPaddingException e2){

e2printStackTrace();

}catch(javalangException e3){

e3printStackTrace();

}

return null;

}

//转换成十六进制字符串

public static String byte2Hex(byte[] b){

String hs="";

String stmp="";

for(int n=0; n<blength; n++){

stmp = (javalangIntegertoHexString(b[n]& 0XFF));

if(stmplength()==1){

hs = hs + "0" + stmp;

}else{

hs = hs + stmp;

}

if(n<blength-1)hs=hs+":";

}

return hstoUpperCase();

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//添加新安全算法,如果用JCE就要把它添加进去

SecurityaddProvider(new comsuncryptoproviderSunJCE());

final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,

(byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79,0x51,

(byte)0xCB,

(byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,

(byte)0x98, 0x30, 0x40, 0x36,

(byte)0xE2

}; //24字节的密钥

String szSrc = "This is a 3DES test 测试";

Systemoutprintln("加密前的字符串:" + szSrc);

byte[] encoded = encryptMode(keyBytes,szSrcgetBytes());

Systemoutprintln("加密后的字符串:" + new String(encoded));

byte[] srcBytes = decryptMode(keyBytes,encoded);

Systemoutprintln("解密后的字符串:" + (new String(srcBytes)));

}

}

1,首先引入前端需要用到的js:crypto-js,下载命令 npm install crypto-js

将 crypto-js 文件放到要引用的路径

以下是要引用到的js

2,引用,jQuery也要记得引用哦

3,在登录页的登录按钮的function里,设置key值和iv值,这是加密的设置字段,定义要进行加密的密码passwordNode

下面再加个function

function aesMinEncrypt(key, iv, word){

var _word = CryptoJSencUtf8parse(word),

_key = CryptoJSencUtf8parse(key),

_iv = CryptoJSencUtf8parse(iv);

var encrypted = CryptoJSAESencrypt(_word, _key, {

iv: _iv,

mode: CryptoJSmodeCBC,

padding: CryptoJSpadPkcs7

});

return encryptedtoString();

}

3,(另一种)上面的过程也可以这样

function encryption(){

//密钥 (需要前端和后端保持一致)十六位作为密钥

var key = "ABCDEFGHIJKL_key";

//密钥偏移量 (需要前端和后端保持一致)十六位作为密钥偏移量

var iv = "ABCDEFGHIJKLM_iv";

var username=documentgetElementById("usr")value;

// var passwordNode=documentgetElementById("paw")value;

var passwordNode=aesMinEncrypt(key,iv,$("#paw")val());

consolelog(passwordNode);

alert("加密后的密码为:"+passwordNode);

$ajax({

url: "login",

async:false,

type: "POST",

data: {'username':username,'password':passwordNode},

success: function (result) {

$("html")html(result);

}

});

}

function aesMinEncrypt(key, iv, word){

var _word = CryptoJSencUtf8parse(word),

_key = CryptoJSencUtf8parse(key),

_iv = CryptoJSencUtf8parse(iv);

var encrypted = CryptoJSAESencrypt(_word, _key, {

iv: _iv,

mode: CryptoJSmodeCBC,

padding: CryptoJSpadPkcs7

});

return encryptedtoString();

$("#form")submit();

}

4,前端加密就算是完成了,接下来是后端解密,后端解密需要用到一个工具类 AESUtils,里面是解密方法代码如下

package comwuyecommonutils;

import cnjpushapiutilsStringUtils;

import sunmiscBASE64Decoder;

import javaxcryptoCipher;

import javaxcryptospecIvParameterSpec;

import javaxcryptospecSecretKeySpec;

/

TODO

@author CSD

@date 2022-07-28 14:16

/

public class AESUtils {

//密钥 (需要前端和后端保持一致)十六位作为密钥

private static final String KEY = "ABCDEFGHIJKL_key";

//密钥偏移量 (需要前端和后端保持一致)十六位作为密钥偏移量

private static final String IV = "ABCDEFGHIJKLM_iv";

//算法

private static final String ALGORITHMSTR = "AES/CBC/PKCS5Padding";

/

base 64 decode

@param base64Code 待解码的base 64 code

@return 解码后的byte[]

@throws Exception

/

public static byte[] base64Decode(String base64Code) throws Exception{

return StringUtilsisEmpty(base64Code) null : new BASE64Decoder()decodeBuffer(base64Code);

}

/

AES解密

@param encryptBytes 待解密的byte[]

@return 解密后的String

@throws Exception

/

public static String aesDecryptByBytes(byte[] encryptBytes) throws Exception {

Cipher cipher = CiphergetInstance(ALGORITHMSTR);

byte[] temp = IVgetBytes("UTF-8");

IvParameterSpec iv = new IvParameterSpec(temp);

cipherinit(CipherDECRYPT_MODE, new SecretKeySpec(KEYgetBytes(), "AES"), iv);

byte[] decryptBytes = cipherdoFinal(encryptBytes);

Systemoutprint(new String(decryptBytes));

return new String(decryptBytes);

}

/

将base 64 code AES解密

@param encryptStr 待解密的base 64 code

@return 解密后的string

@throws Exception

/

public static String aesDecrypt(String encryptStr) throws Exception {

return StringUtilsisEmpty(encryptStr) null : aesDecryptByBytes(base64Decode(encryptStr));

}

//测试一下

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

String str = "Q uus tQvLdwtGSldhrtKQ==";

str = strreplace(" ", "+");

Systemoutprintln(str);

aesDecrypt(str);

}

}

5,在密码验证的java页面做解密,建议打断点看看走的哪里,解密很简单,就一句

password = AESUtilsaesDecrypt(getPassword

在生成密钥时,我用自己提供的一个密码,用这句SecretKeySpec aesKey = new SecretKeySpec("12345678"getBytes(), "AES"); “12345678”提供的个任意长度的密码,通过它生成。

package comsunaes;

import javamathBigInteger;

import javaxcryptoCipher;

import javaxcryptospecSecretKeySpec;

import orgapachecommonscodecbinaryBase64;

import orgapachecommonscodecbinaryHex;

public class AES {

/

 加密

 @param String src 加密字符串

 @param String key 密钥

 @return 加密后的字符串

/

public static String Encrypt(String src, String key) throws Exception {

// 判断密钥是否为空

if (key == null) {

Systemoutprint("密钥不能为空");

return null;

}

// 密钥补位

int plus= 16-keylength();

byte[] data = keygetBytes("utf-8");

byte[] raw = new byte[16];

byte[] plusbyte={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

for(int i=0;i<16;i++)

{

if (datalength > i)

raw[i] = data[i];

else

raw[i] = plusbyte[plus];

}

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

Cipher cipher = CiphergetInstance("AES/ECB/PKCS5Padding"); // 算法/模式/补码方式

cipherinit(CipherENCRYPT_MODE, skeySpec);

byte[] encrypted = cipherdoFinal(srcgetBytes("utf-8"));

//return new Base64()encodeToString(encrypted);//base64

return binary(encrypted, 16); //十六进制

}

/

 解密

 @param String src 解密字符串

 @param String key 密钥

 @return 解密后的字符串

/

public static String Decrypt(String src, String key) throws Exception {

try {

// 判断Key是否正确

if (key == null) {

Systemoutprint("Key为空null");

return null;

}

// 密钥补位

int plus= 16-keylength();

byte[] data = keygetBytes("utf-8");

byte[] raw = new byte[16];

byte[] plusbyte={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

for(int i=0;i<16;i++)

{

if (datalength > i)

raw[i] = data[i];

else

raw[i] = plusbyte[plus];

}

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

Cipher cipher = CiphergetInstance("AES/ECB/PKCS5Padding");

cipherinit(CipherDECRYPT_MODE, skeySpec);

//byte[] encrypted1 = new Base64()decode(src);//base64

byte[] encrypted1 = toByteArray(src);//十六进制

try {

byte[] original = cipherdoFinal(encrypted1);

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

return originalString;

} catch (Exception e) {

Systemoutprintln(etoString());

return null;

}

} catch (Exception ex) {

Systemoutprintln(extoString());

return null;

}

}

/

 将byte[]转为各种进制的字符串

 @param bytes byte[]

 @param radix 可以转换进制的范围,从CharacterMIN_RADIX到CharacterMAX_RADIX,超出范围后变为10进制

 @return 转换后的字符串

/

public static String binary(byte[] bytes, int radix){

return new BigInteger(1, bytes)toString(radix);    // 这里的1代表正数

}

/

 16进制的字符串表示转成字节数组

 @param hexString 16进制格式的字符串

 @return 转换后的字节数组

/

public static byte[] toByteArray(String hexString) {

if (hexStringisEmpty())

throw new IllegalArgumentException("this hexString must not be empty");

hexString = hexStringtoLowerCase();

final byte[] byteArray = new byte[hexStringlength() / 2];

int k = 0;

for (int i = 0; i < byteArraylength; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先

byte high = (byte) (Characterdigit(hexStringcharAt(k), 16) & 0xff);

byte low = (byte) (Characterdigit(hexStringcharAt(k + 1), 16) & 0xff);

byteArray[i] = (byte) (high << 4 | low);

k += 2;

}

return byteArray;

}

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

// 密钥

String key = "smph20151208shao";

// 需要加密的字符串

String src = "出版社";

Systemoutprintln(src);

// 加密

String enString = Encrypt(src, key);

Systemoutprintln("加密后的字串是:" + enString);

// 解密

String DeString = Decrypt(enString, key);

Systemoutprintln("解密后的字串是:" + DeString);

}

}  

AES加密过程涉及到 4 种 *** 作,分别是字节替代、行移位、列混淆和轮密钥加。

1字节替换:字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

2行移位:行移位的功能是实现一个4x4矩阵内部字节之间的置换。

4轮密钥加:加密过程中,每轮的输入与轮密钥异或一次(当前分组和扩展密钥的一部分进行按位异或);因为二进制数连续异或一个数结果是不变的,所以在解密时再异或上该轮的密钥即可恢复输入。

5密钥扩展:其复杂性是确保算法安全性的重要部分。当分组长度和密钥长度都是128位时,AES的加密算法共迭代10轮,需要10个子密钥。AES的密钥扩展的目的是将输入的128位密钥扩展成11个128位的子密钥。AES的密钥扩展算法是以字为一个基本单位(一个字为4个字节),刚好是密钥矩阵的一列。因此4个字(128位)密钥需要扩展成11个子密钥,共44个字。

package compalicpssafcsworldthroughcommonutil;

import javaxcryptoCipher;

import javaxcryptospecSecretKeySpec;

import repackcomthoughtworksxstreamcoreutilBase64Encoder;

/

  AES加密解密

  @author EX-CHENQI004

 

 /

public class AesUtils {

public static final String cKey= "assistant7654321";

  / 

      加密--把加密后的byte数组先进行二进制转16进制在进行base64编码 

      @param sSrc 

      @param sKey 

      @return 

      @throws Exception 

     /  

    public static String encrypt(String sSrc, String sKey) throws Exception {  

        if (sKey == null) {  

            throw new IllegalArgumentException("Argument sKey is null");  

        }  

        if (sKeylength() != 16) {  

            throw new IllegalArgumentException(  

                    "Argument sKey'length is not 16");  

        }  

        byte[] raw = sKeygetBytes("ASCII");  

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

  

        Cipher cipher = CiphergetInstance("AES");  

        cipherinit(CipherENCRYPT_MODE, skeySpec);  

  

        byte[] encrypted = cipherdoFinal(sSrcgetBytes("UTF-8"));  

        String tempStr = parseByte2HexStr(encrypted);  

  

        Base64Encoder encoder = new Base64Encoder();  

        return encoderencode(tempStrgetBytes("UTF-8"));  

    }  

  

    / 

     解密--先 进行base64解码,在进行16进制转为2进制然后再解码 

      @param sSrc 

      @param sKey 

      @return 

      @throws Exception 

     /  

    public static String decrypt(String sSrc, String sKey) throws Exception {  

  

        if (sKey == null) {  

            throw new IllegalArgumentException("499");  

        }  

        if (sKeylength() != 16) {  

            throw new IllegalArgumentException("498");  

        }  

  

        byte[] raw = sKeygetBytes("ASCII");  

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

  

        Cipher cipher = CiphergetInstance("AES");  

        cipherinit(CipherDECRYPT_MODE, skeySpec);  

  

        Base64Encoder encoder = new Base64Encoder();  

        byte[] encrypted1 = encoderdecode(sSrc);  

  

        String tempStr = new String(encrypted1, "utf-8");  

        encrypted1 = parseHexStr2Byte(tempStr);  

        byte[] original = cipherdoFinal(encrypted1);  

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

        return originalString;  

    }  

  

    / 

      将二进制转换成16进制 

       

      @param buf 

      @return 

     /  

    public static String parseByte2HexStr(byte buf[]) {  

        StringBuffer sb = new StringBuffer();  

        for (int i = 0; i < buflength; i++) {  

            String hex = IntegertoHexString(buf[i] & 0xFF);  

            if (hexlength() == 1) {  

                hex = '0' + hex;  

            }  

            sbappend(hextoUpperCase());  

        }  

        return sbtoString();  

    }  

  

    / 

      将16进制转换为二进制 

       

      @param hexStr 

      @return 

     /  

    public static byte[] parseHexStr2Byte(String hexStr) {  

        if (hexStrlength() < 1)  

            return null;  

        byte[] result = new byte[hexStrlength() / 2];  

        for (int i = 0; i < hexStrlength() / 2; i++) {  

            int high = IntegerparseInt(hexStrsubstring(i  2, i  2 + 1), 16);  

            int low = IntegerparseInt(hexStrsubstring(i  2 + 1, i  2 + 2),  

                    16);  

            result[i] = (byte) (high  16 + low);  

        }  

        return result;  

    } 

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

/

  加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定

 /

String cKey = "assistant7654321";

// 需要加密的字串

String cSrc = "123456";

// 加密

long lStart = SystemcurrentTimeMillis();

String enString = encrypt(cSrc, cKey);

Systemoutprintln("加密后的字串是:" + enString);

long lUseTime = SystemcurrentTimeMillis() - lStart;

Systemoutprintln("加密耗时:" + lUseTime + "毫秒");

// 解密

lStart = SystemcurrentTimeMillis();

String DeString = decrypt(enString, cKey);

Systemoutprintln("解密后的字串是:" + DeString);

lUseTime = SystemcurrentTimeMillis() - lStart;

Systemoutprintln("解密耗时:" + lUseTime + "毫秒");

}

}

在生成密钥时,我用自己提供的一个密码,用这句SecretKeySpec aesKey = new SecretKeySpec("12345678"getBytes(), "AES"); “12345678”提供的个任意长度的密码,通过它生成。

package comsunaes;

import javamathBigInteger;

import javaxcryptoCipher;

import javaxcryptospecSecretKeySpec;

import orgapachecommonscodecbinaryBase64;

import orgapachecommonscodecbinaryHex;

public class AES {

/

 加密

 @param String src 加密字符串

 @param String key 密钥

 @return 加密后的字符串

/

public static String Encrypt(String src, String key) throws Exception {

// 判断密钥是否为空

if (key == null) {

Systemoutprint("密钥不能为空");

return null;

}

// 密钥补位

int plus= 16-keylength();

byte[] data = keygetBytes("utf-8");

byte[] raw = new byte[16];

byte[] plusbyte={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

for(int i=0;i<16;i++)

{

if (datalength > i)

raw[i] = data[i];

else

raw[i] = plusbyte[plus];

}

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

Cipher cipher = CiphergetInstance("AES/ECB/PKCS5Padding"); // 算法/模式/补码方式

cipherinit(CipherENCRYPT_MODE, skeySpec);

byte[] encrypted = cipherdoFinal(srcgetBytes("utf-8"));

//return new Base64()encodeToString(encrypted);//base64

return binary(encrypted, 16); //十六进制

}

/

 解密

 @param String src 解密字符串

 @param String key 密钥

 @return 解密后的字符串

/

public static String Decrypt(String src, String key) throws Exception {

try {

// 判断Key是否正确

if (key == null) {

Systemoutprint("Key为空null");

return null;

}

// 密钥补位

int plus= 16-keylength();

byte[] data = keygetBytes("utf-8");

byte[] raw = new byte[16];

byte[] plusbyte={ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

for(int i=0;i<16;i++)

{

if (datalength > i)

raw[i] = data[i];

else

raw[i] = plusbyte[plus];

}

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

Cipher cipher = CiphergetInstance("AES/ECB/PKCS5Padding");

cipherinit(CipherDECRYPT_MODE, skeySpec);

//byte[] encrypted1 = new Base64()decode(src);//base64

byte[] encrypted1 = toByteArray(src);//十六进制

try {

byte[] original = cipherdoFinal(encrypted1);

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

return originalString;

} catch (Exception e) {

Systemoutprintln(etoString());

return null;

}

} catch (Exception ex) {

Systemoutprintln(extoString());

return null;

}

}

/

 将byte[]转为各种进制的字符串

 @param bytes byte[]

 @param radix 可以转换进制的范围,从CharacterMIN_RADIX到CharacterMAX_RADIX,超出范围后变为10进制

 @return 转换后的字符串

/

public static String binary(byte[] bytes, int radix){

return new BigInteger(1, bytes)toString(radix);    // 这里的1代表正数

}

/

 16进制的字符串表示转成字节数组

 @param hexString 16进制格式的字符串

 @return 转换后的字节数组

/

public static byte[] toByteArray(String hexString) {

if (hexStringisEmpty())

throw new IllegalArgumentException("this hexString must not be empty");

hexString = hexStringtoLowerCase();

final byte[] byteArray = new byte[hexStringlength() / 2];

int k = 0;

for (int i = 0; i < byteArraylength; i++) {//因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先

byte high = (byte) (Characterdigit(hexStringcharAt(k), 16) & 0xff);

byte low = (byte) (Characterdigit(hexStringcharAt(k + 1), 16) & 0xff);

byteArray[i] = (byte) (high << 4 | low);

k += 2;

}

return byteArray;

}

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

// 密钥

String key = "smph20151208shao";

// 需要加密的字符串

String src = "出版社";

Systemoutprintln(src);

// 加密

String enString = Encrypt(src, key);

Systemoutprintln("加密后的字串是:" + enString);

// 解密

String DeString = Decrypt(enString, key);

Systemoutprintln("解密后的字串是:" + DeString);

}

}  

接下来我们介绍对称加密算法 最常用的莫过于DES数据加密算法

DES

DES Data Encryption Standard 即数据加密算法 是IBM公司于 年研究成功并公开发表的 DES算法的入口参数有三个 Key Data Mode 其中Key为 个字节共 位 是DES算法的工作密钥 Data也为 个字节 位 是要被加密或被解密的数据 Mode为DES的工作方式 有两种 加密或解密

DES算法把 位的明文输入块变为 位的密文输出块 它所使用的密钥也是 位

通过java代码实现如下

import java security Key;   import java security SecureRandom;     import javax crypto Cipher;   import javax crypto KeyGenerator;   import javax crypto SecretKey;   import javax crypto SecretKeyFactory;   import javax crypto spec DESKeySpec;       / //    DES安全编码组件  author by ;      <pre>    支持 DES DESede(TripleDES 就是 DES) AES Blowfish RC RC (ARCFOUR)    DES                  key size must be equal to      DESede(TripleDES)    key size must be equal to   or      AES                  key size must be equal to     or  but   and   bits may not be available    Blowfish             key size must be multiple of   and can only range from   to   (inclusive)    RC                   key size must be beeen   and   bits    RC (ARCFOUR)         key size must be beeen   and   bits    具体内容 需要关注 JDK Document&///docs/technotes/guides/security/l    </pre>        @author 梁栋    @version      @since     /  public abstract class DESCoder extends Coder {       / //        ALGORITHM 算法 <br>        可替换为以下任意一种算法 同时key值的size相应改变                 <pre>        DES                  key size must be equal to          DESede(TripleDES)    key size must be equal to   or          AES                  key size must be equal to     or  but   and   bits may not be available        Blowfish             key size must be multiple of   and can only range from   to   (inclusive)        RC                   key size must be beeen   and   bits        RC (ARCFOUR)         key size must be beeen   and   bits        </pre>                在Key toKey(byte[] key)方法中使用下述代码        <code>SecretKey secretKey = new SecretKeySpec(key  ALGORITHM);</code> 替换        <code>        DESKeySpec dks = new DESKeySpec(key);        SecretKeyFactory keyFactory = SecretKeyFactory getInstance(ALGORITHM);        SecretKey secretKey = keyFactory generateSecret(dks);        </code>       /      public static final String ALGORITHM =  DES ;         / //        转换密钥<br>                @param key        @return        @throws Exception       /      private static Key toKey(byte[] key) throws Exception {           DESKeySpec dks = new DESKeySpec(key);           SecretKeyFactory keyFactory = SecretKeyFactory getInstance(ALGORITHM);           SecretKey secretKey = keyFactory generateSecret(dks);             // 当使用其他对称加密算法时 如AES Blowfish等算法时 用下述代码替换上述三行代码           // SecretKey secretKey = new SecretKeySpec(key  ALGORITHM);             return secretKey;       }         / //        解密                @param data        @param key        @return        @throws Exception       /      public static byte[] decrypt(byte[] data  String key) throws Exception {           Key k = toKey(decryptBASE (key));             Cipher cipher = Cipher getInstance(ALGORITHM);           cipher init(Cipher DECRYPT_MODE  k);             return cipher doFinal(data);       }         / //        加密                @param data        @param key        @return        @throws Exception       /      public static byte[] encrypt(byte[] data  String key) throws Exception {           Key k = toKey(decryptBASE (key));           Cipher cipher = Cipher getInstance(ALGORITHM);           cipher init(Cipher ENCRYPT_MODE  k);             return cipher doFinal(data);       }         / //        生成密钥                @return        @throws Exception       /      public static String initKey() throws Exception {           return initKey(null);       }         / //        生成密钥                @param seed        @return        @throws Exception       /      public static String initKey(String seed) throws Exception {           SecureRandom secureRandom = null;             if (seed != null) {               secureRandom = new SecureRandom(decryptBASE (seed));           } else {               secureRandom = new SecureRandom();           }             KeyGenerator kg = KeyGenerator getInstance(ALGORITHM);           kg init(secureRandom);             SecretKey secretKey = kg generateKey();             return encryptBASE (secretKey getEncoded());       }   }

延续上一个类的实现 我们通过MD 以及SHA对字符串加密生成密钥 这是比较常见的密钥生成方式

再给出一个测试类

import static  junit Assert ;     import  junit Test;     / //        @author by ;;  @version      @since     /  public class DESCoderTest {         @Test      public void test() throws Exception {           String inputStr =  DES ;           String key = DESCoder initKey();           System err println( 原文:\t  + inputStr);             System err println( 密钥:\t  + key);             byte[] inputData = inputStr getBytes();           inputData = DESCoder encrypt(inputData  key);             System err println( 加密后:\t  + DESCoder encryptBASE (inputData));             byte[] outputData = DESCoder decrypt(inputData  key);           String outputStr = new String(outputData);             System err println( 解密后:\t  + outputStr);             assertEquals(inputStr  outputStr);       }   }

得到的输出内容如下

原文 DES

密钥 f wEtRrV q =

加密后     C qe oNIzRY=

解密后     DES

由控制台得到的输出 我们能够比对加密 解密后结果一致 这是一种简单的加密解密方式 只有一个密钥

其实DES有很多同胞兄弟 如DESede(TripleDES) AES Blowfish RC RC (ARCFOUR) 这里就不过多阐述了 大同小异 只要换掉ALGORITHM换成对应的值 同时做一个代码替换SecretKey secretKey = new SecretKeySpec(key ALGORITHM) 就可以了 此外就是密钥长度不同了

/

lishixinzhi/Article/program/Java/gj/201311/27624

以上就是关于求java中3des加密解密示例全部的内容,包括:求java中3des加密解密示例、前端页面显示了签名的密钥怎么办、Cipher.getInstance("AES/ECB/PKCS5Padding"); 这句话总是报错。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10087903.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存