javatdes的简单介绍

博主:adminadmin 2023-01-17 20:18:10 206

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

本文目录一览:

用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()

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和.NET使用DES对称加密的区别

没有区别,DES只是加密的一种算法,Java与.NET语言中只是对这种算法的实现,所以两者是没有任何区别的。算法与密钥本来就是分开的,算法本来就是公开的,语言只是对这种算法的实现而已,在这种情况下DES与语言没有任何相关性,只有自己的算法标准。

但很多人反映的Java中的DES/TDES与.NET中的DES/TDES不通用,其实并不存在这样的问题的。两者是几乎完全通用的。所以没有存在不通用的情况的。

由于语言的实现基于自己的习惯与理解上的不同,不同的语言采用了不同的默认参数(默认值),当然,就算在同种语言下,这些参数不同的时加密与解密也会有所不同的(只会默认默认参数就认为不通用的那些人,真想不通这个问题怎么提出来的)。

事实上DES除了一个key与iv(初始向量)必须保证相同外,还有对加密的不同解释参数,如mode与paddingmode。DES加密是是块加密的一种,在处理块级与未尾块级时,有不同的方式(mode)如电子密码本(CBC)之类的,每个参数有不同的加密行为与意义,当然这只是DES加密标准的一部分,并不能独立出去的。paddingMode则是则块加密当最后一个块不足时的填充方式。而在java与net实现加密或解密时都遵从标准,实现了不同的填充方式以供选择。但由于每个语言的默认值不同,如net中cbc是默认值,而Java中则是另外一个,填充方式的默认值也不相同,所以会出现不设计这两个参数时,在java与net通信时无法正确解密。所谓的不Java与net中DES不同,仅仅只是默认参数不同,如果你能正确设置这两个参数,几乎任何语言中DES加密与解密都是通用的(部分语言中并没有全部实现DES中的标准,所以可能会出现特定语言的某种加密方式无法在另一种语言中解析)。

所以,DES本身没有任何区别,他只是一个标准(你家交流电与他家交流电有什么区别?),对于不同的实现必须依赖于此标准实现,所以DES标准本身而言是相同的。如果说DES在Java与NET中的类库实现有什么区别,那么两种语言类库完全没可比性(两个人有什么区别,一张嘴两只眼睛的标准外,怕是没有相同之处了),而对于DES实现支持上,两者也是几乎相同,Java与net均实现了DES标准全部的规范。

最后想说的是,加密学中只介绍DES,并不说在不同语言中的实现,因为任何语言实现都依赖于相同的DES加解密算法。我觉得这个问题应该问成“在DES在java中与NET中实现的类库默认值有什么不同”才对。

symbian s60 用什么软件开发

你是想学习symbian应用程序编写吧?

Symbian是以Nokai为首的各手机厂商合伙开发的一个操作系统,主要用于高端的智能手机。其开发语言为C++,可以使用MicrosoftVisual C++ 6.0作为集成化的开发环境,看来虽然Symbian的目标是跟微软的SmartPhone较劲,在采取的手段和方法上却也是不拘一格,微软更是暗暗叫苦,谁让当时vc6设计的这么开放,结果被敌人拿去做武器了。本文主要针对的是Symbian开发入门,所以应该是非常简单的事,因为毕竟Symbian的开发语言是C++,并不会因为是用于手机的操作系统就复杂了多少,就象很多人一直挂在嘴边的J2ME也毕竟是Java语言,并不会因为用在手机上就高深了多少一样。5小时是我从对Symbian一无所知到完成本文花在Symbian上的所有时间。因为是用于手机的操作系统,所以我们研究Symbian的话,先选定一款手机再说。Nokia的60系列平台是一个很不错的选择,Nokia根据手机的屏幕大小和价格高低把手机分成了多个系列,60系列目前有两款手机:7650和3650。60系列采用Symbian os 6.1,然后又根据手机屏幕的特点对UI做了一些修改,这个被修改了的Symbian就被称为Nokia的60系列平台。所以入门的第一步就是要下载S60的SDK,可以从Nokia的开发论坛上下载:。看Nokia网站上最新的是1.0,不过下面又有个0.9中文版,所以自然要下载这个0.9版了。100多兆吧,不想下的话,可以跟Nokia要光盘,估计他们应该很高兴给。这个0.9中文版的模拟器是中文版的,而且有支持GBK和UNICODE转换的类,不知道1.0的英文版有没有。下载完了就是安装,选一个目录装就是了,不过最好装在C盘上。可能是考虑到Windows平台和Unix平台都能用的缘故,这套SDK在处理盘符和目录时比较弱智,我当时SDK装到C盘,自己的程序放到D盘用vc6生成新项目就有问题,经观察是盘符的问题。所以保险起见的话,最好装在C盘,有兴趣的可以替Nokia测试一下。另外,还需要Java的运行库和Perl,SDK里也都带了,不过他自带的Perl在我的XP下装有问题,我下载了一个最新的ActivePerl才最终算是安装完毕。从SDK的安装来看,这帮搞手机的搞软件好像确实不太专业。刚才说了,我的Symbian安装到了C盘,在C盘的Symbian目录下,有一个6.1的目录,6.1目录下有两个目录:Series60和Shared。还好,从名字上能看出大体的意思。请一定注意Series60目录下的Epoc32\BUILD目录,因为这个目录以后要反复的用到。接下来的任务就是要编译一下HelloWorld,然后再运行一下看看了。首先得确认你的系统装VC6了(最好能装sp3以上,否则将来用到vc6时会报警),而且得把C:\Program Files\Microsoft Visual Studio\VC98\Bin放到你的PATH里,主要是用nmake.exe。所以如果你有nmake的话,不装vc6也可以看helloworld。找到helloword例子的目录,在我这里是C:\Symbian\6.1\Series60、Series60Ex\HelloWorld\groupSymbian里,一个Project通常是按inc,src,group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行bldmake bldfiles,这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在C:\Symbian\6.1\Series60\Epoc32\BUILD下生成C:\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\SERIES60\SERIES60EX\HELLOWORLD\GROUP这个深的一个目录,并在最底层目录下生成一堆.make文件。(实在理解不了为什么要这么搞?因为他们是生产手机的?)虽然它生成了这么多东西,但是我们不要管,继续输入abld build wins udeb,这个命令会编译我们的程序,最后在C:\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB。目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,打开other目录就可以运行helloworld了。如果要在VC6里编译和运行HelloWorld,在运行完bldmake bldfiles后,运行abld makefilevc6,则会生成vc6的dsw文件,位置在C:\Symbian\6.1\Series60\Epoc32\BUILD\SYMBIAN\6.1\SERIES60 \SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS看Symbian把这点事搞得这么麻烦,也真是不容易。如果要直接在vc6里创建新项目的话,要把C:\Symbian\6.1\Series60\Series60Tools目录下的文件拷贝到vc6的模板目录下才可以。折腾到这里,可能得花2个多小时吧,剩下的两个多小时得看看文档了。先看看HelloWorld的帮助文档,理解一下Symbian程序的体系结构。Symbian程序也是按照VC的文档视图结构来组织程序的,有Application类CAknApplication,有Document类CAknDocument,有Frame类CAknAppUi,有视图类CCoeControl等,跟vc的结构好像是差不多的,但感觉上它的Document类好像是做样子的,我还没看到这一块。关于这些类之间的调用关系,在HelloWorld的文档里有个顺序图非常好,一看便知。在看Symbian的代码时,感觉最不适应的可能就是经常看到PushL和Pop函数,还有就是很多的函数都有L或LC的后缀。其实这是Symbian的例外处理机制。比如说我们定义了一个指针,给它分配了空间,可是在使用它的时候程序突然间出现了致命错误中止了,那这个指针占用的地址空间我们肯定是收不回来了,在PC上编程这一点可能问题不大,内存那么多,而且用不了多长时间就重启动了,但是Symbian的设计者可能认为这在手机上是不行的,所以对这一点做了很多的设计。Symbian有一个Clean up stack,在使用指针时,用PushL把指针压入栈中,使用完后在用Pop弹出栈,如果在中间调用可能导致崩溃的函数时果真出现了问题,那么Clean up stack可以通过调用该指针的析构函数回收占用的空间。这些可能导致崩溃的函数在Symbian里被称为可能Leave的函数,所以就在这些函数的尾部加了一个L。而加LC后缀的函数表明该函数已经在内部把指针用PushL压入clean upstack了,调用时无需再用PushL,直接调用完用Pop既可。Clean up stack还提供了一个PopAndDestroy函数,就是弹出栈后再销毁指针。顺便提一句,正式因为有了Clean upstack机制,所以Symbian在有些地方看起来跟VC的程序不太一样,比如说很多类的构造函数都不用,用NewL或NewLC构造,分配地址时的操作符new()也变成了new(ELeave)。上述内容可以看一下Symbian编程基础中的内存管理一节。Symbian自己定义了一堆的数据类型,如果不想找麻烦的话,还是乖乖的用这些类型的好。简单说一下,整型有TInt和TUint,其中又分为8位的,16位的和32位的,如TInt8,TInt16,TInt32;文本类型是TText,又细分为TText8和TText16,但内部都是Unicode的,所以实际上内部引用应该都是TText16;bool型是TBool,对应的值有ETrue和EFalse;浮点型是TReal,但又分为TReal32和TReal64;还有一个引用类型TRefByvalue,是以模板类的形式提供的。 因为Symbian是冲着更面向对象设计的,所以在我们常见的字符串这块变化比较大,在Symbian里叫descriptor。最底层的是两个抽象类TDesC和TDes,实际上TDes也是继承的TDesC,TDesC中的C字母是常量constant的意思。即带C字母结束的都是定义的常量,是不可以修改的,而不带C的都有一个最大长度的限制,是可以修改的,下面也是同样的道理。指针描述符是TPtrC和TPtr,类似于C++中的char *;缓冲区描述符(Buffer descriptor)是TBufC和TBuf,类似于char [];堆描述符是HBufC,类似于(char *)malloc(length+1)的用法。具体用时,上述的类型又分为8位的和16位的。举个例子:TBuf64 buf;CEikonEnv::Static()-ReadResource( buf, R_EXAMPLE_VIEW_TITLE );先定义了一个最大长度是64的缓冲区,然后读入名为R_EXAMPLE_VIEW_TITLE的资源。再例如:TText8 *str = (TText8*)"示范窗口标题";TPtrC8 source( str );iInfoText = HBufC::NewL( source.Length() );TPtr16 ptr = iInfoText-Des();定义一个8位的字符串str,然后构造一个指针常量source,根据source长度再定义一个16位的指针,下一步我这里没写,但明显着应该是把gbk的转换为unicode了。Symbian的资源文件一般是以rss为扩展名的,没有专门的资源文件编辑器,用户必须用记事本打开rss文件手工编写rss文件。这个都有一定的规则和方法,参考例子不难编写自己的资源文件。需要注意的一点是,如果资源文件里包含中文,那么必须把文件另存为utf-8格式的才可。入门相对来说是比较简单的,但精通就需要大量的实践了。

java用io怎么对文件进行加密?代码!!

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()

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

一个例子

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;

}

}

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