关于cryptojava的信息

博主:adminadmin 2022-12-06 22:03:09 66

本篇文章给大家谈谈cryptojava,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

javax.crypto.*在java的哪个包中

你好,这个jar所在的目录是:

C:\program Files\Java\jre6\lib\jce.jar

是jdk自带的库

O(∩_∩)O~温馨提示O(∩_∩)O~

真心希望你能采纳我的回答,如有不明白,可以继续追问,若满意,记得及时采纳。

如何用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

*/

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给文件夹加密,拜求各位大侠!

一个例子

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.io.*;

import java.security.*;

import javax.crypto.*;

import javax.crypto.spec.*;

/**

文件名:FileEncrypter.java

JDK:1.40以上

说明:文件加密

加密方法:三重DES加密

加密过程:对选中的文件加密后在同文件夹下生成一个增加了".tdes"

扩展名的加密文件

解密过程:对选中的加密文件(必须有".tdes"扩展名)进行解密

*/

public class FileEncrypter extends JFrame{

public static final int WIDTH = 550;

public static final int HEIGHT = 200;

public static void main(String args[]) {

FileEncrypter fe = new FileEncrypter();

fe.show();

}

FileEncrypter(){

this.setSize(WIDTH,HEIGHT);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setResizable(false);

Toolkit tk = Toolkit.getDefaultToolkit();

Dimension screenSize = tk.getScreenSize();

this.setLocation((screenSize.width - WIDTH)/2,

(screenSize.height - HEIGHT)/2);

this.setTitle("文件加密器(TriDES)");

Container c = this.getContentPane();

c.setLayout( new FlowLayout());

final FilePanel fp = new FilePanel("文件选择");

c.add(fp);

final KeyPanel pp = new KeyPanel("密码");

c.add(pp);

JButton jbE = new JButton("加密");

c.add(jbE);

jbE.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent event){

File file = new File(fp.getFileName());

if (file.exists())

encrypt(file.getAbsoluteFile(),pp.getKey());

else

JOptionPane.showMessageDialog(

null,"请选择文件!","提示",JOptionPane.OK_OPTION);

}

});

JButton jbD = new JButton("解密");

c.add(jbD);

jbD.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent event){

File file = new File(fp.getFileName());

if (file.exists())

decrypt(file.getAbsoluteFile(),pp.getKey());

else

JOptionPane.showMessageDialog(

null,"请选择文件!","提示",JOptionPane.OK_OPTION);

}

});

}

/**

加密函数

输入:

要加密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如:

AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746

其中:

AD67EA2F3BE6E5AD DES密码一

D368DFE03120B5DF DES密码二

92A8FD8FEC2F0746 DES密码三

输出:

对输入的文件加密后,保存到同一文件夹下增加了".tdes"扩展名的文件中。

*/

private void encrypt(File fileIn,String sKey){

try{

if(sKey.length() == 48){

byte[] bytK1 = getKeyByStr(sKey.substring(0,16));

byte[] bytK2 = getKeyByStr(sKey.substring(16,32));

byte[] bytK3 = getKeyByStr(sKey.substring(32,48));

FileInputStream fis = new FileInputStream(fileIn);

byte[] bytIn = new byte[(int)fileIn.length()];

for(int i = 0;ifileIn.length();i++){

bytIn[i] = (byte)fis.read();

}

//加密

byte[] bytOut = encryptByDES(encryptByDES(

encryptByDES(bytIn,bytK1),bytK2),bytK3);

String fileOut = fileIn.getPath() + ".tdes";

FileOutputStream fos = new FileOutputStream(fileOut);

for(int i = 0;ibytOut.length;i++){

fos.write((int)bytOut[i]);

}

fos.close();

JOptionPane.showMessageDialog(

this,"加密成功!","提示",JOptionPane.OK_OPTION);

}else

JOptionPane.showMessageDialog(

this,"密码长度必须等于48!","错误信息",JOptionPane.ERROR_MESSAGE);

}catch(Exception e){

e.printStackTrace();

}

}

/**

解密函数

输入:

要解密的文件,密码(由0-F组成,共48个字符,表示3个8位的密码)如:

AD67EA2F3BE6E5ADD368DFE03120B5DF92A8FD8FEC2F0746

其中:

AD67EA2F3BE6E5AD DES密码一

D368DFE03120B5DF DES密码二

92A8FD8FEC2F0746 DES密码三

输出:

对输入的文件解密后,保存到用户指定的文件中。

*/

private void decrypt(File fileIn,String sKey){

try{

if(sKey.length() == 48){

String strPath = fileIn.getPath();

if(strPath.substring(strPath.length()-5).toLowerCase().equals(".tdes"))

strPath = strPath.substring(0,strPath.length()-5);

else{

JOptionPane.showMessageDialog(

this,"不是合法的加密文件!","提示",JOptionPane.OK_OPTION);

return;

}

JFileChooser chooser = new JFileChooser();

chooser.setCurrentDirectory(new File("."));

chooser.setSelectedFile(new File(strPath));

//用户指定要保存的文件

int ret = chooser.showSaveDialog(this);

if(ret==JFileChooser.APPROVE_OPTION){

byte[] bytK1 = getKeyByStr(sKey.substring(0,16));

byte[] bytK2 = getKeyByStr(sKey.substring(16,32));

byte[] bytK3 = getKeyByStr(sKey.substring(32,48));

FileInputStream fis = new FileInputStream(fileIn);

byte[] bytIn = new byte[(int)fileIn.length()];

for(int i = 0;ifileIn.length();i++){

bytIn[i] = (byte)fis.read();

}

//解密

byte[] bytOut = decryptByDES(decryptByDES(

decryptByDES(bytIn,bytK3),bytK2),bytK1);

File fileOut = chooser.getSelectedFile();

fileOut.createNewFile();

FileOutputStream fos = new FileOutputStream(fileOut);

for(int i = 0;ibytOut.length;i++){

fos.write((int)bytOut[i]);

}

fos.close();

JOptionPane.showMessageDialog(

this,"解密成功!","提示",JOptionPane.OK_OPTION);

}

}else

JOptionPane.showMessageDialog(

this,"密码长度必须等于48!","错误信息",JOptionPane.ERROR_MESSAGE);

}catch(Exception e){

JOptionPane.showMessageDialog(

this,"解密失败,请核对密码!","提示",JOptionPane.OK_OPTION);

}

}

/**

用DES方法加密输入的字节

bytKey需为8字节长,是加密的密码

*/

private byte[] encryptByDES(byte[] bytP,byte[] bytKey) throws Exception{

DESKeySpec desKS = new DESKeySpec(bytKey);

SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");

SecretKey sk = skf.generateSecret(desKS);

Cipher cip = Cipher.getInstance("DES");

cip.init(Cipher.ENCRYPT_MODE,sk);

return cip.doFinal(bytP);

}

/**

用DES方法解密输入的字节

bytKey需为8字节长,是解密的密码

*/

private byte[] decryptByDES(byte[] bytE,byte[] bytKey) throws Exception{

DESKeySpec desKS = new DESKeySpec(bytKey);

SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");

SecretKey sk = skf.generateSecret(desKS);

Cipher cip = Cipher.getInstance("DES");

cip.init(Cipher.DECRYPT_MODE,sk);

return cip.doFinal(bytE);

}

/**

输入密码的字符形式,返回字节数组形式。

如输入字符串:AD67EA2F3BE6E5AD

返回字节数组:{ 173,103,234,47,59,230,229,173 }

*/

private byte[] getKeyByStr(String str){

byte[] bRet = new byte[str.length()/2];

for(int i=0;istr.length()/2;i++){

Integer itg =

new Integer(16*getChrInt(str.charAt(2*i)) + getChrInt(str.charAt(2*i+1)));

bRet[i] = itg.byteValue();

}

return bRet;

}

/**

计算一个16进制字符的10进制值

输入:0-F

*/

private int getChrInt(char chr){

int iRet=0;

if(chr=="0".charAt(0)) iRet = 0;

if(chr=="1".charAt(0)) iRet = 1;

if(chr=="2".charAt(0)) iRet = 2;

if(chr=="3".charAt(0)) iRet = 3;

if(chr=="4".charAt(0)) iRet = 4;

if(chr=="5".charAt(0)) iRet = 5;

if(chr=="6".charAt(0)) iRet = 6;

if(chr=="7".charAt(0)) iRet = 7;

if(chr=="8".charAt(0)) iRet = 8;

if(chr=="9".charAt(0)) iRet = 9;

if(chr=="A".charAt(0)) iRet = 10;

if(chr=="B".charAt(0)) iRet = 11;

if(chr=="C".charAt(0)) iRet = 12;

if(chr=="D".charAt(0)) iRet = 13;

if(chr=="E".charAt(0)) iRet = 14;

if(chr=="F".charAt(0)) iRet = 15;

return iRet;

}

}

/**

文件选择组件。

*/

class FilePanel extends JPanel{

FilePanel(String str){

JLabel label = new JLabel(str);

JTextField fileText = new JTextField(35);

JButton chooseButton = new JButton("浏览...");

this.add(label);

this.add(fileText);

this.add(chooseButton);

clickAction ca = new clickAction(this);

chooseButton.addActionListener(ca);

}

public String getFileName(){

JTextField jtf = (JTextField)this.getComponent(1);

return jtf.getText();

}

private class clickAction implements ActionListener{

clickAction(Component c){

cmpt = c;

}

public void actionPerformed(ActionEvent event){

JFileChooser chooser = new JFileChooser();

chooser.setCurrentDirectory(new File("."));

int ret = chooser.showOpenDialog(cmpt);

if(ret==JFileChooser.APPROVE_OPTION){

JPanel jp = (JPanel)cmpt;

JTextField jtf = (JTextField)jp.getComponent(1);

jtf.setText(chooser.getSelectedFile().getPath());

}

}

private Component cmpt;

}

}

/**

密码生成组件。

*/

class KeyPanel extends JPanel{

KeyPanel(String str){

JLabel label = new JLabel(str);

JTextField fileText = new JTextField(35);

JButton chooseButton = new JButton("随机产生");

this.add(label);

this.add(fileText);

this.add(chooseButton);

clickAction ca = new clickAction(this);

chooseButton.addActionListener(ca);

}

//返回生成的密码(48个字符长度)

public String getKey(){

JTextField jtf = (JTextField)this.getComponent(1);

return jtf.getText();

}

private class clickAction implements ActionListener{

clickAction(Component c){

cmpt = c;

}

public void actionPerformed(ActionEvent event){

try{

KeyGenerator kg = KeyGenerator.getInstance("DES");

kg.init(56);

Key ke = kg.generateKey();

byte[] bytK1 = ke.getEncoded();

ke = kg.generateKey();

byte[] bytK2 = ke.getEncoded();

ke = kg.generateKey();

byte[] bytK3 = ke.getEncoded();

JPanel jp = (JPanel)cmpt;

JTextField jtf = (JTextField)jp.getComponent(1);

jtf.setText(getByteStr(bytK1)+getByteStr(bytK2)+getByteStr(bytK3));

}catch(Exception e){

e.printStackTrace();

}

}

private String getByteStr(byte[] byt){

String strRet = "";

for(int i=0;ibyt.length;i++){

//System.out.println(byt[i]);

strRet += getHexValue((byt[i]240)/16);

strRet += getHexValue(byt[i]15);

}

return strRet;

}

private String getHexValue(int s){

String sRet=null;

switch (s){

case 0: sRet = "0";break;

case 1: sRet = "1";break;

case 2: sRet = "2";break;

case 3: sRet = "3";break;

case 4: sRet = "4";break;

case 5: sRet = "5";break;

case 6: sRet = "6";break;

case 7: sRet = "7";break;

case 8: sRet = "8";break;

case 9: sRet = "9";break;

case 10: sRet = "A";break;

case 11: sRet = "B";break;

case 12: sRet = "C";break;

case 13: sRet = "D";break;

case 14: sRet = "E";break;

case 15: sRet = "F";

}

return sRet;

}

private Component cmpt;

}

}

java中如何实现对文件和字符串加密. 解密?

DES 密钥生成,加解密方法,,你可以看一下

//DES 密钥生成工具

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.security.spec.InvalidKeySpecException;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESKeySpec;

public class GenKey {

private static final String DES = "DES";

public static final String SKEY_NAME = "key.des";

public static void genKey1(String path) {

// 密钥

SecretKey skey = null;

// 密钥随机数生成

SecureRandom sr = new SecureRandom();

//生成密钥文件

File file = genFile(path);

try {

// 获取密钥生成实例

KeyGenerator gen = KeyGenerator.getInstance(DES);

// 初始化密钥生成器

gen.init(sr);

// 生成密钥

skey = gen.generateKey();

// System.out.println(skey);

ObjectOutputStream oos = new ObjectOutputStream(

new FileOutputStream(file));

oos.writeObject(skey);

oos.close();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

/**

* @param file : 生成密钥的路径

* SecretKeyFactory 方式生成des密钥

* */

public static void genKey2(String path) {

// 密钥随机数生成

SecureRandom sr = new SecureRandom();

// byte[] bytes = {11,12,44,99,76,45,1,8};

byte[] bytes = sr.generateSeed(20);

// 密钥

SecretKey skey = null;

//生成密钥文件路径

File file = genFile(path);

try {

//创建deskeyspec对象

DESKeySpec desKeySpec = new DESKeySpec(bytes,9);

//实例化des密钥工厂

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

//生成密钥对象

skey = keyFactory.generateSecret(desKeySpec);

//写出密钥对象

ObjectOutputStream oos = new ObjectOutputStream(

new FileOutputStream(file));

oos.writeObject(skey);

oos.close();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (InvalidKeySpecException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

private static File genFile(String path) {

String temp = null;

File newFile = null;

if (path.endsWith("/") || path.endsWith("\\")) {

temp = path;

} else {

temp = path + "/";

}

File pathFile = new File(temp);

if (!pathFile.exists())

pathFile.mkdirs();

newFile = new File(temp+SKEY_NAME);

return newFile;

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

genKey2("E:/a/aa/");

}

}

//DES加解密方法

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import javax.crypto.Cipher;

import javax.crypto.CipherInputStream;

import javax.crypto.SecretKey;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

/**

*制卡文件加/解密 加密方式DES

*/

public class SecUtil {

public static final Log log = LogFactory.getLog(SecUtil.class);

/**

* 解密

*

* @param keyPath

* 密钥路径

* @param source

* 解密前文件

* @param dest

* 解密后文件

*/

public static void decrypt(String keyPath, String source, String dest) {

SecretKey key = null;

try {

ObjectInputStream keyFile = new ObjectInputStream(

// 读取加密密钥

new FileInputStream(keyPath));

key = (SecretKey) keyFile.readObject();

keyFile.close();

} catch (FileNotFoundException ey1) {

log.info("Error when read keyFile");

throw new RuntimeException(ey1);

} catch (Exception ey2) {

log.info("error when read the keyFile");

throw new RuntimeException(ey2);

}

// 用key产生Cipher

Cipher cipher = null;

try {

// 设置算法,应该与加密时的设置一样

cipher = Cipher.getInstance("DES");

// 设置解密模式

cipher.init(Cipher.DECRYPT_MODE, key);

} catch (Exception ey3) {

log.info("Error when create the cipher");

throw new RuntimeException(ey3);

}

// 取得要解密的文件并解密

File file = new File(source);

String filename = file.getName();

try {

// 输出流,请注意文件名称的获取

BufferedOutputStream out = new BufferedOutputStream(

new FileOutputStream(dest));

// 输入流

CipherInputStream in = new CipherInputStream(

new BufferedInputStream(new FileInputStream(file)), cipher);

int thebyte = 0;

while ((thebyte = in.read()) != -1) {

out.write(thebyte);

}

in.close();

out.close();

} catch (Exception ey5) {

log.info("Error when encrypt the file");

throw new RuntimeException(ey5);

}

}

/**

* 加密

* @param keyPath 密钥路径

* @param source 加密前文件

* @param dest 加密后文件

*/

public static void encrypt(String keyPath, String source, String dest) {

SecretKey key = null;

try {

ObjectInputStream keyFile = new ObjectInputStream(

// 读取加密密钥

new FileInputStream(keyPath));

key = (SecretKey) keyFile.readObject();

keyFile.close();

} catch (FileNotFoundException ey1) {

log.info("Error when read keyFile");

throw new RuntimeException(ey1);

} catch (Exception ey2) {

log.info("error when read the keyFile");

throw new RuntimeException(ey2);

}

// 用key产生Cipher

Cipher cipher = null;

try {

// 设置算法,应该与加密时的设置一样

cipher = Cipher.getInstance("DES");

// 设置解密模式

cipher.init(Cipher.ENCRYPT_MODE, key);

} catch (Exception ey3) {

log.info("Error when create the cipher");

throw new RuntimeException(ey3);

}

// 取得要解密的文件并解密

File file = new File(source);

String filename = file.getName();

try {

// 输出流,请注意文件名称的获取

BufferedOutputStream out = new BufferedOutputStream(

new FileOutputStream(dest));

// 输入流

CipherInputStream in = new CipherInputStream(

new BufferedInputStream(new FileInputStream(file)), cipher);

int thebyte = 0;

while ((thebyte = in.read()) != -1) {

out.write(thebyte);

}

in.close();

out.close();

} catch (Exception ey5) {

log.info("Error when encrypt the file");

throw new RuntimeException(ey5);

}

}

}

C#加密Java解密

DES加密 java与 C# 可以相互加密解密

这里的KEY采用Base64编码,便用分发,因为Java的Byte范围为-128至127,c#的Byte范围是0-255

核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章

一个是C#采用CBC Mode,PKCS7 Padding,Java采用CBC Mode,PKCS5Padding Padding,

另一个是C#采用ECB Mode,PKCS7 Padding,Java采用ECB Mode,PKCS5Padding Padding,

Java的ECB模式不需要IV

对字符加密时,双方采用的都是UTF-8编码

C# 代码

/// summary

/// DES3加密解密

/// /summary

public class Des3

{

#region CBC模式**

/// summary

/// DES3 CBC模式加密

/// /summary

/// param name="key"密钥/param

/// param name="iv"IV/param

/// param name="data"明文的byte数组/param

/// returns密文的byte数组/returns

public static byte[] Des3EncodeCBC( byte[] key, byte[] iv, byte[] data )

{

//复制于MSDN

try

{

// Create a MemoryStream.

MemoryStream mStream = new MemoryStream();

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();

tdsp.Mode = CipherMode.CBC; //默认值

tdsp.Padding = PaddingMode.PKCS7; //默认值

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream cStream = new CryptoStream( mStream,

tdsp.CreateEncryptor( key, iv ),

CryptoStreamMode.Write );

// Write the byte array to the crypto stream and flush it.

cStream.Write( data, 0, data.Length );

cStream.FlushFinalBlock();

// Get an array of bytes from the

// MemoryStream that holds the

// encrypted data.

byte[] ret = mStream.ToArray();

// Close the streams.

cStream.Close();

mStream.Close();

// Return the encrypted buffer.

return ret;

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );

return null;

}

}

/// summary

/// DES3 CBC模式解密

/// /summary

/// param name="key"密钥/param

/// param name="iv"IV/param

/// param name="data"密文的byte数组/param

/// returns明文的byte数组/returns

public static byte[] Des3DecodeCBC( byte[] key, byte[] iv, byte[] data )

{

try

{

// Create a new MemoryStream using the passed

// array of encrypted data.

MemoryStream msDecrypt = new MemoryStream( data );

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();

tdsp.Mode = CipherMode.CBC;

tdsp.Padding = PaddingMode.PKCS7;

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream csDecrypt = new CryptoStream( msDecrypt,

tdsp.CreateDecryptor( key, iv ),

CryptoStreamMode.Read );

// Create buffer to hold the decrypted data.

byte[] fromEncrypt = new byte[data.Length];

// Read the decrypted data out of the crypto stream

// and place it into the temporary buffer.

csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length );

//Convert the buffer into a string and return it.

return fromEncrypt;

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );

return null;

}

}

#endregion

#region ECB模式

/// summary

/// DES3 ECB模式加密

/// /summary

/// param name="key"密钥/param

/// param name="iv"IV(当模式为ECB时,IV无用)/param

/// param name="str"明文的byte数组/param

/// returns密文的byte数组/returns

public static byte[] Des3EncodeECB( byte[] key, byte[] iv, byte[] data )

{

try

{

// Create a MemoryStream.

MemoryStream mStream = new MemoryStream();

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();

tdsp.Mode = CipherMode.ECB;

tdsp.Padding = PaddingMode.PKCS7;

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream cStream = new CryptoStream( mStream,

tdsp.CreateEncryptor( key, iv ),

CryptoStreamMode.Write );

// Write the byte array to the crypto stream and flush it.

cStream.Write( data, 0, data.Length );

cStream.FlushFinalBlock();

// Get an array of bytes from the

// MemoryStream that holds the

// encrypted data.

byte[] ret = mStream.ToArray();

// Close the streams.

cStream.Close();

mStream.Close();

// Return the encrypted buffer.

return ret;

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );

return null;

}

}

/// summary

/// DES3 ECB模式解密

/// /summary

/// param name="key"密钥/param

/// param name="iv"IV(当模式为ECB时,IV无用)/param

/// param name="str"密文的byte数组/param

/// returns明文的byte数组/returns

public static byte[] Des3DecodeECB( byte[] key, byte[] iv, byte[] data )

{

try

{

// Create a new MemoryStream using the passed

// array of encrypted data.

MemoryStream msDecrypt = new MemoryStream( data );

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();

tdsp.Mode = CipherMode.ECB;

tdsp.Padding = PaddingMode.PKCS7;

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream csDecrypt = new CryptoStream( msDecrypt,

tdsp.CreateDecryptor( key, iv ),

CryptoStreamMode.Read );

// Create buffer to hold the decrypted data.

byte[] fromEncrypt = new byte[data.Length];

// Read the decrypted data out of the crypto stream

// and place it into the temporary buffer.

csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length );

//Convert the buffer into a string and return it.

return fromEncrypt;

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );

return null;

}

}

#endregion

/// summary

/// 类测试

/// /summary

public static void Test()

{

System.Text.Encoding utf8 = System.Text.Encoding.UTF8;

//key为abcdefghijklmnopqrstuvwx的Base64编码

byte[] key = Convert.FromBase64String( "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4" );

byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; //当模式为ECB时,IV无用

byte[] data = utf8.GetBytes( "中国ABCabc123" );

System.Console.WriteLine( "ECB模式:" );

byte[] str1 = Des3.Des3EncodeECB( key, iv, data );

byte[] str2 = Des3.Des3DecodeECB( key, iv, str1 );

System.Console.WriteLine( Convert.ToBase64String( str1 ) );

System.Console.WriteLine( System.Text.Encoding.UTF8.GetString( str2 ) );

System.Console.WriteLine();

System.Console.WriteLine( "CBC模式:" );

byte[] str3 = Des3.Des3EncodeCBC( key, iv, data );

byte[] str4 = Des3.Des3DecodeCBC( key, iv, str3 );

System.Console.WriteLine( Convert.ToBase64String( str3 ) );

System.Console.WriteLine( utf8.GetString( str4 ) );

System.Console.WriteLine();

}

}

java 代码:

import java.security.Key;

import javax.crypto.Cipher;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESedeKeySpec;

import javax.crypto.spec.IvParameterSpec;

import sun.misc.BASE64Decoder;

import sun.misc.BASE64Encoder;

public class Des3 {

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

byte[] key=new BASE64Decoder().decodeBuffer("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4");

byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };

byte[] data="中国ABCabc123".getBytes("UTF-8");

System.out.println("ECB加密解密");

byte[] str3 = des3EncodeECB(key,data );

byte[] str4 = ees3DecodeECB(key, str3);

System.out.println(new BASE64Encoder().encode(str3));

System.out.println(new String(str4, "UTF-8"));

System.out.println();

System.out.println("CBC加密解密");

byte[] str5 = des3EncodeCBC(key, keyiv, data);

byte[] str6 = des3DecodeCBC(key, keyiv, str5);

System.out.println(new BASE64Encoder().encode(str5));

System.out.println(new String(str6, "UTF-8"));

}

/**

* ECB加密,不要IV

* @param key 密钥

* @param data 明文

* @return Base64编码的密文

* @throws Exception

*/

public static byte[] des3EncodeECB(byte[] key, byte[] data)

throws Exception {

Key deskey = null;

DESedeKeySpec spec = new DESedeKeySpec(key);

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");

deskey = keyfactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, deskey);

byte[] bOut = cipher.doFinal(data);

return bOut;

}

/**

* ECB解密,不要IV

* @param key 密钥

* @param data Base64编码的密文

* @return 明文

* @throws Exception

*/

public static byte[] ees3DecodeECB(byte[] key, byte[] data)

throws Exception {

Key deskey = null;

DESedeKeySpec spec = new DESedeKeySpec(key);

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");

deskey = keyfactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");

cipher.init(Cipher.DECRYPT_MODE, deskey);

byte[] bOut = cipher.doFinal(data);

return bOut;

}

/**

* CBC加密

* @param key 密钥

* @param keyiv IV

* @param data 明文

* @return Base64编码的密文

* @throws Exception

*/

public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data)

throws Exception {

Key deskey = null;

DESedeKeySpec spec = new DESedeKeySpec(key);

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");

deskey = keyfactory.generateSecret(spec);

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

IvParameterSpec ips = new IvParameterSpec(keyiv);

cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);

byte[] bOut = cipher.doFinal(data);

return bOut;

}

/**

* CBC解密

* @param key 密钥

* @param keyiv IV

* @param data Base64编码的密文

* @return 明文

* @throws Exception

*/

public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data)

throws Exception {

Key deskey = null;

DESedeKeySpec spec = new DESedeKeySpec(key);

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");

deskey = keyfactory.generateSecret(spec);

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

IvParameterSpec ips = new IvParameterSpec(keyiv);

cipher.init(Cipher.DECRYPT_MODE, deskey, ips);

byte[] bOut = cipher.doFinal(data);

return bOut;

}

}

为什么 CryptoJS DES 加密的结果和 Java DES 不一样

1.注意取字符串bytes是编码保持一致,不如都用Unicode

2.key和Iv保持一致

3.加密模式和填充方式保持一致 比如C#里 algo.Mode=CipherMode.ECB; algo.Padding=PaddingMode.None; 则java里对应的为 final Cipher algo=Cipher.getInstance("DES/ECB/NoPadding");

cryptojava的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、cryptojava的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-06,除非注明,否则均为首码项目网原创文章,转载请注明出处。