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);
}
}
相关推荐
C语言实现SHA-224/SHA-256/SHA-384/SHA-512摘要算法。编译环境:VS2010。请参考我的博客: SHA-224:https://blog.csdn.net/u013073067/article/details/86605223 SHA-256:...
这些算法的C语言实现对于理解和研究散列函数的工作原理,以及在实际项目中应用SHA算法都具有很高的参考价值。同时,由于SHA-1的安全性已被广泛质疑,建议在新项目中优先考虑使用SHA-256或更安全的算法。
总之,MD5、SHA1、SHA256和SHA512是用于数据完整性验证和安全认证的哈希函数,它们通过特定的算法将数据转化为固定长度的摘要。C语言实现这些算法时,需要理解和掌握哈希函数的工作原理,并考虑跨平台兼容性和效率...
在本文中,我们将探讨两种常见的哈希算法:SHA256和MD5。 首先,MD5(Message-Digest Algorithm 5)是由Ron Rivest在1991年设计的,它生成一个128位(16字节)的哈希值。MD5曾被广泛用于数据校验和密码存储,但由于...
在“C# 文件校验码查看器”这款应用中,整合了MD5、SHA1、SHA256、SHA384、SHA512以及CRC32这六种常见的校验算法,以方便用户快速检查文件的完整性。 1. MD5(Message-Digest Algorithm 5):MD5是最为人所知的校验...
哈希计算工具,支持:文件,文本字符串,十六进制字符串的数据格式。支持:MD5,MD4,SHA1,SHA256,SHA384,SHA512,RIPEMD160,PANAMA,TIGER,MD2,ADLER32,CRC32等算法。 备注:只是工具,不带源码。
在Windows 10操作系统中,计算文件的MD5、SHA1和SHA256校验值是一项重要的任务,尤其在验证文件的完整性和安全性时。这些校验算法提供了对文件内容的一种数学摘要,使得我们可以检查文件是否在传输或存储过程中被...
MD5(Message-Digest Algorithm 5)、SHA1(Secure Hash Algorithm 1)和SHA256(Secure Hash Algorithm 2,256位版本)是常见的哈希函数,用于生成固定长度的数字指纹,常用于数据完整性校验、密码存储等领域。...
根据给定文件的信息,本文将深入探讨C#中MD5、SHA1、SHA256、SHA512这四种加密算法的实现方法,并通过具体的代码示例来展示如何使用这些算法进行数据加密。 ### 一、理解MD5、SHA1、SHA256、SHA512 #### 1. MD5 MD...
JAVA 加密算法
在VC++环境下,我们可以使用C++语言来实现SHA256加密算法,并结合MFC(Microsoft Foundation Classes)库来创建用户界面,提供更加便捷的操作。 SHA256的主要特点包括: 1. 安全性:SHA256算法被设计成对于任何给定...
实现多种Hash算法,包括MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512
标题中的“HMAC-SHA1/SHA256/MD5标准dll”指的是一个动态链接库(DLL)文件,该文件包含了实现哈希消息认证码(HMAC)算法的函数,这些算法包括SHA-1、SHA-256以及MD5。DLL文件是一种在Windows操作系统中广泛使用的...
当前流行的散列算法如MD4、MD5和SHA-1提供的散列值长度分别为128位和160位,因此它们对碰撞攻击的安全性分别不超过64位和80位。随着新高级加密标准(AES)的推广,需要提供类似级别的增强安全性的散列算法。SHA-256...
本文将深入探讨如何使用C#实现四种常见的加密算法:MD5、SHA1、SHA256、SHA512,并通过示例代码来理解这些算法的具体应用。 ### MD5 (Message-Digest Algorithm 5) MD5是一种广泛使用的散列函数,它可以将任意长度...
MD5、SHA1和SHA256是三种广泛使用的散列函数,它们在信息安全领域扮演着重要的角色。本文将深入探讨这些算法的原理、实现以及C语言中的应用。 首先,MD5(Message-Digest Algorithm 5)是由Ronald Rivest在1991年...
在这个主题中,我们主要关注三种哈希算法:SHA256、MD5和SHA1。这些算法都是将任意长度的数据转换为固定长度的摘要,具有单向性和抗碰撞性。 1. **MD5(Message-Digest Algorithm 5)** - **简介**:MD5由Ronald ...
详细整理了MD5、SHA1、SHA256、SHA512的算法,如果你有C语言基础,那么看完你就能写出代码了。 内附代码用于理解算法,只经过简单测试,仅供参考,建议自行撰写、优化。 代码使用示例: st_md5 tMD5; md5_Init(&...
## 说明 此程序可以进行sha1,sha256,md5的加密 在input输入框内输入所需加密的数据,然后点击"encryption"按扭即可实现加密; 默认input输入框内的数据为123456
在Windows操作系统中,我们可以使用各种工具来验证文件的MD5、SHA-1、SHA-256以及SHA-512哈希值,这些哈希算法都是用来生成文件唯一数字指纹的方法。 标题提到的"windows校验MD5, SHA-1, SHA-256 & SHA-512工具"是...