在java中如何实现对数据进行3DES的ECB加密算法

问题描述

在java中如何实现对数据进行3DES的ECB加密算法

要加密的数据为:5140000000080401AEBFFFFFFFF7FBFE

密钥为:00000000000000000000000000000000

最后的结果为:DBBE8A87A4E37D95B5EDDD2BE6A4151F

我的代码为:

//SecretKey负责对称密钥的保存
    private SecretKey desKey;

    //完成加密和解密工作
    private Cipher c;

    //保存加密结果
    private byte[] cipherResultByte;

    private final static String Algorithm = "DESede/ECB/NoPadding";//加密方法/运算模式

    private static DESedeKeySpec dks;

    private static SecretKeyFactory keyFactory;   

    public DESeseTest02() {

        Security.addProvider(new com.sun.crypto.provider.SunJCE());

        try {

            dks = new DESedeKeySpec("00000000000000000000000000000000".getBytes());   

             keyFactory = SecretKeyFactory.getInstance("DESede");

            //生成密钥
            desKey=keyFactory.generateSecret(dks);

            //生成Cipher对象,指定其支持DES算法
            c=Cipher.getInstance(Algorithm);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        }
    }

    public byte[] createEncryptor(byte[] b){

        try {

//          System.out.println(str);
            //根据密钥,对Cipher进行初使化,DECRYPT_MODE加密模式
            c.init(Cipher.ENCRYPT_MODE, desKey);

//          byte[] input=str.getBytes();
//          System.out.println(input.length);

            //加密,将结果保存
            cipherResultByte=c.doFinal(b);

        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return cipherResultByte;
    }

可加密出来的数据不对,大家帮忙给看看是怎么回事?谢谢大家

解决方案

把这行

"00000000000000000000000000000000".getBytes()

换成

new byte[34]

"0".getBytes()这句和new byte[]{0}这句不一样

解决方案二:

你密钥生成有问题,32个0的密钥,在内存里其实是16字节数据,所以你"0...0".getBytes().这句0的个数应该是16个,而不是32个。

时间: 2024-12-28 21:48:39

在java中如何实现对数据进行3DES的ECB加密算法的相关文章

java中前台可以修改数据成功,但是数据却不能更新到数据库中。

问题描述 java中前台可以修改数据成功,但是数据却不能更新到数据库中. 在前台修改了数据成功后,可是数据库的数据却没有更新,还是以前的数据. <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforg

二进制-java中的64位数据和32位数据的区别

问题描述 java中的64位数据和32位数据的区别 之前在看数据之间的相互比较的时候,遇到这样一个问题 "数值间的相等比较,本质是比较他们二进制存储是否相等.例如:0.3f==0.3返回的是false(32位的2进制的0.3表示和64位的0.3表示是不同的):但是0.5f==0.5返回的是true(因为32位和64位的二进制表示是相同的)" 那么我怎么知道要比较的这两个数在32位和64位中是否相等呢,有什么办法吗> 本人初学java,还望给各位多多指点 解决方案 32位和64位下

java中从数据库读数据,是以String形式读出来,但存在问题,求大神帮忙看看,代码如下

问题描述 java中从数据库读数据,是以String形式读出来,但存在问题,求大神帮忙看看,代码如下 用System.out.print显示出来的内容是"192.168.1.1"但后面的if(name=="192.168.1.1") jLabel2.setIcon(ic4);却不成功,不知道是什么原因 sql = con.createStatement(); res = sql.executeQuery("select * from gjsb")

Java中函数参数传递和数据存储

值传递是将要传递的值作为一副本传递的..引用传递,传递的是引用对象的内存地址..例如: int i=4;  int j=i;   //相当于把4复制了一个副本赋给了j 输出结果是i=4 ,j=4 Cint *p,*p1;int j=5;p=j;    //这里是把j在内存当中的地址赋给了指针pp1=p;   //这里是把指针p中保存的地址(就是j的地址)赋给了指针p1 j=4;    //这里改变j的值 输出结果是  j=4  ,  *p=4  ,  *p1=4  //因为p和p1指向的都是j

[J2SE]Java中3DES加密解密调用示例_JSP编程

jce.jar security/US_export_policy.jar security/local_policy.jar ext/sunjce_provider.jar Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中.对于WEB应用,不需要把这些包加到WEB-INF/lib目录下. 以下是java中调用sun公司提供的3DES加密解密算法的样本代码: 复制代码 代码如下: /*字符串 DESede(3DES) 加密*/ import

select-java中怎么获取sql数据表中某指定行(gysqc=get_item)的所有数据?求解答

问题描述 java中怎么获取sql数据表中某指定行(gysqc=get_item)的所有数据?求解答 String get_item = (String) box.getSelectedItem(); String sql_chaxun = "select * from tb_gysinfo"; try { conn = daoConn.getConn(); st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, Res

java中如何让setText方法读取指定标签数据的时候特意空出一点点空间

问题描述 java中如何让setText方法读取指定标签数据的时候特意空出一点点空间 如何让setText方法读取指定标签数据的时候特意空出一点点空间java当中 解决方案 http://zhidao.baidu.com/link?url=znfx-j9HEz7fJS4EcXcc-gX096uqEKQMTQo4vBNrc9bhRAlFHGGxkAP8cPTOkATWxy3DqxQwhBwFAscWkNPxe_,用空字符串占位置看看可不可以也就是字符串前面有空格,后面有空格. 解决方案二: 使用全

Java项目中使用Hibernate处理数据

数据|项目 对象-关系映射(O/R映射)是许多软件开发项目的常见需求.数据持久化过程中所涉及到的活动是非常乏味且易于出错的.如果考虑到不可避免的需求变化,我们就面临很大的麻烦:数据存储结构必须与源代码保持同步.再加上移植性问题,事情就变得非常复杂. 而Hibernate可以帮助我们轻松地在永久性存储介质中保存数据,而不需要在选择存储.安装或配置类型方面浪费太多精力.Hibernate允许我们存储任何类型的对象,因此,应用程序不需要知道其数据将使用Hibernate进行持久化.当然,这里提到的任何

Java中ResultSet数据自动填充到类中&amp;amp;类实例填充PreparedStatement

需求: (1)提取ResultSet中值到一个类中挺麻烦的,需要new一个变量,使用对应成员的Set方法赋值,能不能根据类的Class,直接提取出ResultSet中的数据,最后返回实例化的类? (2)可以用PreparedStatement预编译带变量的sql语句,在execute之前需要将变量值填充进去,一个一个设置太麻烦了,能不能提供一个类变量,使用类成员变量的值自动填充PreparedStatement? 这样的功能许多开源的框架可以实现,但是不想因为这么一点点的需求去学习那么庞大的一套