`

MD2/MD5/SHA/SHA256/SHA384/SHA512算法

 
阅读更多

package qeeka.test.qeeka.test;  

import java.security.InvalidAlgorithmParameterException;  

import java.security.InvalidKeyException;  

import java.security.NoSuchAlgorithmException;  

import java.security.SecureRandom;  

import java.security.spec.AlgorithmParameterSpec;  

  

import javax.crypto.BadPaddingException;  

import javax.crypto.Cipher;  

import javax.crypto.IllegalBlockSizeException;  

import javax.crypto.KeyGenerator;  

import javax.crypto.NoSuchPaddingException;  

import javax.crypto.SecretKey;  

import javax.crypto.spec.IvParameterSpec;  

  

/** 

 * 通过AES算法对文本进行加密解密 

 * @author ShaoJiang 

 * 

 */  

public class AESUtil {  

    private static byte[] keyValue = new byte[] {       //用户密钥  

        22,25,-35,-45,25,98,-55,-45,10,35,-45,25,  

        26,-95,25,-65,-78,-99,85,45,-62,10,-0,11,  

        -35,48,-98,65,-32,14,-78,25,36,-56,-45,-45,  

        12,15,-35,-75,15,-14,62,-25,33,-45,55,68,-88  

    };  

    private static byte[] iv = new byte[] {             //算法参数  

        -12,35,-25,65,45,-87,95,-22,-15,45,55,-66,32,5-4,84,55  

    };  

    private static SecretKey key;                       //加密密钥  

    private static AlgorithmParameterSpec paramSpec;    //算法参数  

    private static Cipher ecipher;                      //加密算法  

      

    static{       

        KeyGenerator kgen;  

        try {  

            //为指定算法生成一个密钥生成器对象。  

            kgen = KeyGenerator.getInstance("AES");  

            //使用用户提供的随机源初始化此密钥生成器,使其具有确定的密钥长度。  

            kgen.init(128, new SecureRandom(keyValue));  

            //使用KeyGenerator生成(对称)密钥。  

            key = kgen.generateKey();  

            //使用iv中的字节作为IV来构造一个 算法参数。  

            paramSpec = new IvParameterSpec(iv);  

            //生成一个实现指定转换的 Cipher 对象  

            ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");         

        } catch (NoSuchAlgorithmException e) {  

            e.printStackTrace();  

        } catch (NoSuchPaddingException e) {  

            e.printStackTrace();  

        }  

    }  

  

    /** 

     * 加密,使用指定数据源生成密钥,使用用户数据作为算法参数进行AES加密 

     * @param msg 加密的数据 

     * @return 

     */  

    public static String encrypt(String msg) {  

        String str = "";  

        try {             

            //用密钥和一组算法参数初始化此 cipher  

            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);  

            //加密并转换成16进制字符串  

            str = asHex(ecipher.doFinal(msg.getBytes()));  

        } catch (BadPaddingException e) {  

            e.printStackTrace();  

        } catch (InvalidKeyException e) {  

            e.printStackTrace();  

        } catch (InvalidAlgorithmParameterException e) {  

            e.printStackTrace();  

        } catch (IllegalBlockSizeException e) {  

            e.printStackTrace();  

        }  

        return str;  

    }  

      

    /** 

     * 解密,对生成的16进制的字符串进行解密 

     * @param value 解密的数据 

     * @return 

     */  

    public static String decrypt(String value) {  

        try {  

            ecipher.init(Cipher.DECRYPT_MODE, key, paramSpec);  

            return new String(ecipher.doFinal(asBin(value)));  

        } catch (BadPaddingException e) {  

            e.printStackTrace();  

        } catch (InvalidKeyException e) {  

            e.printStackTrace();  

        } catch (InvalidAlgorithmParameterException e) {  

            e.printStackTrace();  

        } catch (IllegalBlockSizeException e) {  

            e.printStackTrace();  

        }  

        return "";  

    }  

  

    /** 

     * 将字节数组转换成16进制字符串 

     * @param buf 

     * @return 

     */  

    private static String asHex(byte buf[]) {  

        StringBuffer strbuf = new StringBuffer(buf.length * 2);  

        int i;  

        for (i = 0; i < buf.length; i++) {  

            if (((int) buf[i] & 0xff) < 0x10)//小于十前面补零  

                strbuf.append("0");  

            strbuf.append(Long.toString((int) buf[i] & 0xff, 16));  

        }  

        return strbuf.toString();  

    }  

  

    /** 

     * 将16进制字符串转换成字节数组 

     * @param src 

     * @return 

     */  

    private static byte[] asBin(String src) {  

        if (src.length() < 1)  

            return null;  

        byte[] encrypted = new byte[src.length() / 2];  

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

            int high = Integer.parseInt(src.substring(i * 2, i * 2 + 1), 16);//取高位字节  

            int low = Integer.parseInt(src.substring(i * 2 + 1, i * 2 + 2), 16);//取低位字节  

            encrypted[i] = (byte) (high * 16 + low);  

        }  

        return encrypted;  

    }  

    

    public static void main(String args[]){

    System.out.println(encrypt("念数成金"));

    System.out.println(decrypt("914a643420185282b9e35c7a3eb848af"));

    }

}

 

package qeeka.test.qeeka.test;

/**

 * reference apache commons <a

 * href="http://commons.apache.org/codec/">http://commons.apache.org/codec/</a>

 * 

 * @author Aub

 * 

 */

public class Hex {

 /**

  * 用于建立十六进制字符的输出的小写字符数组

  */

 private static final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5',

   '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

 /**

  * 用于建立十六进制字符的输出的大写字符数组

  */

 private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5',

   '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

 /**

  * 将字节数组转换为十六进制字符数组

  * 

  * @param data

  *            byte[]

  * @return 十六进制char[]

  */

 public static char[] encodeHex(byte[] data) {

  return encodeHex(data, true);

 }

 /**

  * 将字节数组转换为十六进制字符数组

  * 

  * @param data

  *            byte[]

  * @param toLowerCase

  *            <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式

  * @return 十六进制char[]

  */

 public static char[] encodeHex(byte[] data, boolean toLowerCase) {

  return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);

 }

 /**

  * 将字节数组转换为十六进制字符数组

  * 

  * @param data

  *            byte[]

  * @param toDigits

  *            用于控制输出的char[]

  * @return 十六进制char[]

  */

 protected static char[] encodeHex(byte[] data, char[] toDigits) {

  int l = data.length;

  char[] out = new char[l << 1];

  // two characters form the hex value.

  for (int i = 0, j = 0; i < l; i++) {

   out[j++] = toDigits[(0xF0 & data[i]) >>> 4];

   out[j++] = toDigits[0x0F & data[i]];

  }

  return out;

 }

 /**

  * 将字节数组转换为十六进制字符串

  * 

  * @param data

  *            byte[]

  * @return 十六进制String

  */

 public static String encodeHexStr(byte[] data) {

  return encodeHexStr(data, true);

 }

 /**

  * 将字节数组转换为十六进制字符串

  * 

  * @param data

  *            byte[]

  * @param toLowerCase

  *            <code>true</code> 传换成小写格式 , <code>false</code> 传换成大写格式

  * @return 十六进制String

  */

 public static String encodeHexStr(byte[] data, boolean toLowerCase) {

  return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);

 }

 /**

  * 将字节数组转换为十六进制字符串

  * 

  * @param data

  *            byte[]

  * @param toDigits

  *            用于控制输出的char[]

  * @return 十六进制String

  */

 protected static String encodeHexStr(byte[] data, char[] toDigits) {

  return new String(encodeHex(data, toDigits));

 }

 /**

  * 将十六进制字符数组转换为字节数组

  * 

  * @param data

  *            十六进制char[]

  * @return byte[]

  * @throws RuntimeException

  *             如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常

  */

 public static byte[] decodeHex(char[] data) {

  int len = data.length;

  if ((len & 0x01) != 0) {

   throw new RuntimeException("Odd number of characters.");

  }

  byte[] out = new byte[len >> 1];

  // two characters form the hex value.

  for (int i = 0, j = 0; j < len; i++) {

   int f = toDigit(data[j], j) << 4;

   j++;

   f = f | toDigit(data[j], j);

   j++;

   out[i] = (byte) (f & 0xFF);

  }

  return out;

 }

 /**

  * 将十六进制字符转换成一个整数

  * 

  * @param ch

  *            十六进制char

  * @param index

  *            十六进制字符在字符数组中的位置

  * @return 一个整数

  * @throws RuntimeException

  *             当ch不是一个合法的十六进制字符时,抛出运行时异常

  */

 protected static int toDigit(char ch, int index) {

  int digit = Character.digit(ch, 16);

  if (digit == -1) {

   throw new RuntimeException("Illegal hexadecimal character " + ch

     + " at index " + index);

  }

  return digit;

 }

 public static void main(String[] args) {

  String srcStr = "待转换字符串";

  String encodeStr = encodeHexStr(srcStr.getBytes());

  String decodeStr = new String(decodeHex(encodeStr.toCharArray()));

  System.out.println("转换前:" + srcStr);

  System.out.println("转换后:" + encodeStr);

  System.out.println("还原后:" + decodeStr);

 }

}

 

分享到:
评论

相关推荐

    SHA-224/SHA-256/SHA-384/SHA-512摘要算法-C语言

    C语言实现SHA-224/SHA-256/SHA-384/SHA-512摘要算法。编译环境:VS2010。请参考我的博客: SHA-224:https://blog.csdn.net/u013073067/article/details/86605223 SHA-256:...

    SHA常用算法实现(SHA-1, SHA256, SHA384, SHA512)

    这些算法的C语言实现对于理解和研究散列函数的工作原理,以及在实际项目中应用SHA算法都具有很高的参考价值。同时,由于SHA-1的安全性已被广泛质疑,建议在新项目中优先考虑使用SHA-256或更安全的算法。

    SHA256、MD5哈希算法实现

    在本文中,我们将探讨两种常见的哈希算法:SHA256和MD5。 首先,MD5(Message-Digest Algorithm 5)是由Ron Rivest在1991年设计的,它生成一个128位(16字节)的哈希值。MD5曾被广泛用于数据校验和密码存储,但由于...

    C# 文件校验码查看器(MD5、SHA1、SHA256、SHA384、SHA512、CRC32)

    在“C# 文件校验码查看器”这款应用中,整合了MD5、SHA1、SHA256、SHA384、SHA512以及CRC32这六种常见的校验算法,以方便用户快速检查文件的完整性。 1. MD5(Message-Digest Algorithm 5):MD5是最为人所知的校验...

    MD5、SHA1、SHA256以及SHA512加解密算法实现

    总之,MD5、SHA1、SHA256和SHA512是用于数据完整性验证和安全认证的哈希函数,它们通过特定的算法将数据转化为固定长度的摘要。C语言实现这些算法时,需要理解和掌握哈希函数的工作原理,并考虑跨平台兼容性和效率...

    哈希计算工具(MD5 MD4 SHA1 SHA256 SHA384 SHA512等)

    哈希计算工具,支持:文件,文本字符串,十六进制字符串的数据格式。支持:MD5,MD4,SHA1,SHA256,SHA384,SHA512,RIPEMD160,PANAMA,TIGER,MD2,ADLER32,CRC32等算法。 备注:只是工具,不带源码。

    win10 计算文件的MD5/SHA1/SHA256的工具 快速

    在Windows 10操作系统中,计算文件的MD5、SHA1和SHA256校验值是一项重要的任务,尤其在验证文件的完整性和安全性时。这些校验算法提供了对文件内容的一种数学摘要,使得我们可以检查文件是否在传输或存储过程中被...

    MD5 SHA1 SHA256 的C语言源码

    MD5(Message-Digest Algorithm 5)、SHA1(Secure Hash Algorithm 1)和SHA256(Secure Hash Algorithm 2,256位版本)是常见的哈希函数,用于生成固定长度的数字指纹,常用于数据完整性校验、密码存储等领域。...

    C#MD5,SHA1,SHA256,SHA512加密算法完整代码

    根据给定文件的信息,本文将深入探讨C#中MD5、SHA1、SHA256、SHA512这四种加密算法的实现方法,并通过具体的代码示例来展示如何使用这些算法进行数据加密。 ### 一、理解MD5、SHA1、SHA256、SHA512 #### 1. MD5 MD...

    java md5 sha1 sha256 sha384 sha 512加密算法

    JAVA 加密算法

    SHA256加密算法

    在VC++环境下,我们可以使用C++语言来实现SHA256加密算法,并结合MFC(Microsoft Foundation Classes)库来创建用户界面,提供更加便捷的操作。 SHA256的主要特点包括: 1. 安全性:SHA256算法被设计成对于任何给定...

    Hash算法 MD2, MD5, SHA-1, SHA-256, SHA-384, or SHA-512

    实现多种Hash算法,包括MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512

    HMAC-SHA1/SHA256/MD5标准dll

    标题中的“HMAC-SHA1/SHA256/MD5标准dll”指的是一个动态链接库(DLL)文件,该文件包含了实现哈希消息认证码(HMAC)算法的函数,这些算法包括SHA-1、SHA-256以及MD5。DLL文件是一种在Windows操作系统中广泛使用的...

    SHA256/SHA512

    当前流行的散列算法如MD4、MD5和SHA-1提供的散列值长度分别为128位和160位,因此它们对碰撞攻击的安全性分别不超过64位和80位。随着新高级加密标准(AES)的推广,需要提供类似级别的增强安全性的散列算法。SHA-256...

    c#_实现MD5_SHA1_SHA256_SHA512等常用加密算法

    本文将深入探讨如何使用C#实现四种常见的加密算法:MD5、SHA1、SHA256、SHA512,并通过示例代码来理解这些算法的具体应用。 ### MD5 (Message-Digest Algorithm 5) MD5是一种广泛使用的散列函数,它可以将任意长度...

    MD5-SHA1-SHA256算法C源码

    MD5、SHA1和SHA256是三种广泛使用的散列函数,它们在信息安全领域扮演着重要的角色。本文将深入探讨这些算法的原理、实现以及C语言中的应用。 首先,MD5(Message-Digest Algorithm 5)是由Ronald Rivest在1991年...

    三种哈希算法的函数: sha256 md5 sha1

    在这个主题中,我们主要关注三种哈希算法:SHA256、MD5和SHA1。这些算法都是将任意长度的数据转换为固定长度的摘要,具有单向性和抗碰撞性。 1. **MD5(Message-Digest Algorithm 5)** - **简介**:MD5由Ronald ...

    杂凑算法详解集V1.1 含C代码 MD5、SHA1、SHA256、SHA512

    详细整理了MD5、SHA1、SHA256、SHA512的算法,如果你有C语言基础,那么看完你就能写出代码了。 内附代码用于理解算法,只经过简单测试,仅供参考,建议自行撰写、优化。 代码使用示例: st_md5 tMD5; md5_Init(&...

    Qt加密算法md5,sha256,sha1

    ## 说明 此程序可以进行sha1,sha256,md5的加密 在input输入框内输入所需加密的数据,然后点击"encryption"按扭即可实现加密; 默认input输入框内的数据为123456

    Java&Android; SHA1、SHA-512、SHA-384等加密算法

    Java&Android; SHA1、SHA-512、SHA-384等加密算法工具类

Global site tag (gtag.js) - Google Analytics