常见的加密算法

前端加密

前端使用开源CryptoJS (crypto.js) 为 JavaScript加密算法,Github地址(https://github.com/brix/crypto-js)。目前已支持的算法包括:

MD5、SHA-1、SHA-256、AES、Rabbit、MARC4、HMAC、HMAC-MD5、HMAC-SHA1、HMAC-SHA256、PBKDF2

下载crypto-js.js,引入到你的HTML文件中,我试验了以上算法中的四种算法,代码如下:

//AES-128-CBC加密模式,key需要为16位,key和iv可以一样
      function encryptAES(data) {
          var key  = CryptoJS.enc.Utf8.parse('123456789abcdefg');
          var iv   = CryptoJS.enc.Utf8.parse('123456789abcdefg');
          return CryptoJS.AES.encrypt(data, key, {iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding}).toString();
      }

//DES加密算法
      function encryptByDES(message) {
          var keyHex = CryptoJS.enc.Utf8.parse("bs7dff53");
          var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
              mode: CryptoJS.mode.ECB,
              padding: CryptoJS.pad.Pkcs7
          });
          return encrypted.toString();
      }

//MD5加密
 var encryPass = CryptoJS.MD5(password).toString();

//SHA1 加密
 var encryPass =CryptoJS.SHA1(password).toString();

为了实现前端加密的算法和后端算法一致,我使用Java编写了后端算法。代码如下:

//使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同!
    private static String aesKEY = "123456789abcdefg";
    private static String aesIV = "123456789abcdefg";
    //DES加密的key 长度为八位
    private static String desKey = "bs7dff53";

    private static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    private static String toHexString(byte[] b) {
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i < b.length; i++) {
            sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
            sb.append(HEX_DIGITS[b[i] & 0x0f]);
        }
        return sb.toString();
    }

    /**
     * MD5加密算法
     * @param SourceString
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static String Bit32(String SourceString) throws NoSuchAlgorithmException {
        MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
        digest.update(SourceString.getBytes());
        byte messageDigest[] = digest.digest();
        return toHexString(messageDigest);
    }

    public static String Bit16(String SourceString) throws NoSuchAlgorithmException {
        return Bit32(SourceString).substring(8, 24);
    }
    /**
     * SHA1算法进行加密
     * @param decript
     * @return
     * @throws Exception
     */
    public static String getSHA1(String decript)throws Exception
    {
        MessageDigest digest = MessageDigest
                .getInstance("SHA-1");
        digest.update(decript.getBytes());
        byte messageDigest[] = digest.digest();
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < messageDigest.length; i++)
        {
            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
            if (shaHex.length() < 2) {
                hexString.append(0);
            }
            hexString.append(shaHex);
        }
        return hexString.toString();
    }


    /**
     * 加密方法
     * @param data  要加密的数据
     * @param key 加密key
     * @param iv 加密iv
     * @return 加密的结果
     * @throws Exception
     */
    public static String encryptAES(String data) throws Exception {
        try {

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"
            int blockSize = cipher.getBlockSize();

            byte[] dataBytes = data.getBytes();
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }

            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

            SecretKeySpec keyspec = new SecretKeySpec(aesKEY.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(aesIV.getBytes());

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);
            return new Base64().encodeToString(encrypted);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 解密方法
     * @param data 要解密的数据
     * @param key  解密key
     * @param iv 解密iv
     * @return 解密的结果
     * @throws Exception
     */
    public static String desEncryptAES(String data) throws Exception {
        try {
            byte[] encrypted1 = new Base64().decode(data);

            Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
            SecretKeySpec keyspec = new SecretKeySpec(aesKEY.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(aesIV.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * DES加密
     * @param datasource
     * @return
     */
    public static String encryptDES(String datasource){
        try{
            SecureRandom random = new SecureRandom();
            DESKeySpec desKeys = new DESKeySpec(desKey.getBytes("UTF-8"));
            //创建一个密匙工厂,然后用它把DESKeySpec转换成
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(desKeys);
            //Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
            //用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
            //现在,获取数据并加密
            byte[] temp = Base64.encodeBase64(cipher.doFinal(datasource.getBytes()));
            return IOUtils.toString(temp,"UTF-8");
        }catch(Throwable e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     * DES解密
     * @return
     */
    public static String decodeDES(String data) throws Exception {
        // DES算法要求有一个可信任的随机数源
        SecureRandom random = new SecureRandom();
        // 创建一个DESKeySpec对象
        DESKeySpec desKeys = new DESKeySpec(desKey.getBytes("UTF-8"));
        // 创建一个密匙工厂
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        // 将DESKeySpec对象转换成SecretKey对象
        SecretKey securekey = keyFactory.generateSecret(desKeys);
        // Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance("DES");
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, securekey, random);
        // 真正开始解密操作
        return IOUtils.toString(cipher.doFinal(Base64.decodeBase64(data)),"UTF-8");
    }

本文分享自微信公众号 - 分母为零(gmg1014)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

如何用好 IDEA ,Java 撸码效率至少提升 5 倍?

以前的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含...

13010
来自专栏BanzClub

线程与Java线程

对于程序的运行过程,操作系统中最重要的两个概念是进程和CPU,进程就是运行程序的一个抽象,CPU主要工作就是对进程的调度。需要理解的是,一个CPU在一个瞬间,只...

18130
来自专栏爱撸猫的杰

Java并发机制的底层实现原理之volatile应用,初学者误看!

  Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制...

13420
来自专栏Java架构师学习

何为内存溢出,何为内存泄露

内存泄漏定义(memory leak):一个不再被程序使用的对象或变量还在内存中占有存储空间。

19830
来自专栏三好码农的三亩自留地

死磕Java泛型(一篇就够)

相信泛型大家都使用过,所以一些基础的知识点就不废话了,以免显得啰嗦。 先看下面的一小段代码

34240
来自专栏happyJared

ArrayList 与 LinkedList 区别

查看源码可以看到, RandomAccess 接口中什么都没有定义。所以,这就是个标识接口,标识那些实现了这个接口的类,具有随机访问的功能。

39420
来自专栏开发之途

重拾Kotlin(20)-对象表达式与对象声明

在 Kotlin 的世界中,可以通过对象声明这一功能来实现 Java 中的单例模式,将类声明与该类的单一实例声明结合到一起

12320
来自专栏指尖下的Android

Error: Java exception was raised during method invocation

项目中有用到 @JavascriptInterface 来JS 、Java 通讯,但是 H5 报了一个异常,我在一个通讯方法里申请动态权限,后发现需要切换到主线...

1.1K20
来自专栏Android技术分享

Android APK瘦身全面总结——如何从32.6M到13.6M

之前我简单介绍了关于svg图片瘦身的问题,在公司,瘦身这个问题是我提出来的,所以这锅我背了。公司项目是32.6M,我给自己的要求就是低于20M。上周花了一个星期...

16320
来自专栏Ryan Miao

Java代码质量检查

又搞一边质量扫描插件,之前做过一遍,然后后面各种忽略,然后就放弃了,所以,应该寻找一种方法,循序渐进的实施。本次将实施一个基本的打包扫描方案,包含

48220

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励