我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > Java中的DES算法工具类
总共48087条微博

动态微博

查看: 1833|回复: 1

Java中的DES算法工具类

[复制链接]

16

主题

5

听众

213

金钱

三袋弟子

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-11-14 11:53:13 |只看该作者 |倒序浏览
本帖最后由 z962416 于 2015-11-14 11:55 编辑

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是56位。
需要用到的包:commons-codec.jar
import java.security.Key;
import java.security.SecureRandom;
import java.util.UUID;


import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;


import org.apache.commons.codec.binary.Base64;


/**
* DESUtil类
*
* @author zmx
*
*/
public class DESUtil {

        public static final String KEY_ALGORITHM = "DES";
        public static final String CIPHER_ALGORITHM = "DES/ECB/ISO10126Padding";
        // 这里设置的BASE_KEY是为了防止key为null或者key小于16位,让处理后的key =BASE_KEY+key
        //可以避免程序报不必要的错误。

        public static final String BASE_KEY = "1q2w3e4r5t6y7u8i";


        /**
         *
         * 生成密钥key对象
         *
         * @param KeyStr
         *            密钥字符串
         * @return 密钥对象
         * @throws InvalidKeyException
         * @throws NoSuchAlgorithmException
         * @throws InvalidKeySpecException
         * @throws Exception
         */
        private static SecretKey keyGenerator(String keyStr) throws Exception {
                byte input[] = HexString2Bytes(BASE_KEY + keyStr);
                DESKeySpec desKey = new DESKeySpec(input);
                SecretKeyFactory keyFactory = SecretKeyFactory
                                .getInstance(KEY_ALGORITHM);
                SecretKey securekey = keyFactory.generateSecret(desKey);
                return securekey;
        }
        private static int parse(char c) {
                if (c >= 'a')
                        return (c - 'a' + 10) & 0x0f;
                if (c >= 'A')
                        return (c - 'A' + 10) & 0x0f;
                return (c - '0') & 0x0f;
        }
        // 从十六进制字符串到字节数组转换
        public static byte[] HexString2Bytes(String hexstr) {
                byte[] b = new byte[hexstr.length() / 2];
                int j = 0;
                for (int i = 0; i < b.length; i++) {
                        char c0 = hexstr.charAt(j++);
                        char c1 = hexstr.charAt(j++);
                        b = (byte) ((parse(c0) << 4) | parse(c1));
                }
                return b;
        }
        /**
         * 加密数据
         *
         * @param data
         *            待加密数据
         * @param key
         *            密钥
         * @return 加密后的数据
         */
        public static String encrypt(String data, String key) throws Exception {
                Key deskey = keyGenerator(key);
                // 实例化Cipher对象,它用于完成实际的加密操作
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                SecureRandom random = new SecureRandom();
                // 初始化Cipher对象,设置为加密模式
                cipher.init(Cipher.ENCRYPT_MODE, deskey, random);
                byte[] results = cipher.doFinal(data.getBytes());
                return Base64.encodeBase64String(results);
        }


        /**
         * 解密数据
         *
         * @param data
         *            待解密数据
         * @param key
         *            密钥
         * @return 解密后的数据
         */
        public static String decrypt(String data, String key) throws Exception {
                Key deskey = keyGenerator(key);
                Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
                // 初始化Cipher对象,设置为解密模式
                cipher.init(Cipher.DECRYPT_MODE, deskey);
                // 执行解密操作
                return new String(cipher.doFinal(Base64.decodeBase64(data)));
        }


}


科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    沙发
    发表于 2015-11-24 21:28:05 |只看该作者
    现在 更 流行 AES 加密了吧
    回复

    使用道具 举报

    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    关闭

    站长推荐上一条 /1 下一条

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表