MD5和3DES加密方式浅析

这几天在做字段加密的内容。所以就把这部分东西简单的了解一下。

1、首先,加密分对称加密及不对称加密。

对称加密:在消息发送前使用密钥对消息进行加密,在对方收到消息后,使用相同的密钥进行解密。

非对称加密:加密和解密使用不同的密钥。通常有密钥A和B,使用A加密得到的密文只有B可以解密(A自身也不可解)。即为私钥和公钥。顾名思义,私钥加密,公钥解密。

典型的对称加密是DES算法,典型的非对称加密是RSA算法。

2、这次使用了MD5和3DES,还是先对这个做一个归纳。

MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。Message-Digest,意思为报文摘要,对不定长的报文做出定长的“报文摘要”。

附代码:

import java.security.MessageDigest;

public static final String encode(String s) {
        char hexDigits[] = {
‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘,
‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ };
try {
byte[] btInput = s.getBytes();
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(btInput);
// 获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

注意:一定要在加密前,将需要加密的字符串转为字节数组。

DES算法:是使用一个56位的密钥以及附加的8位奇偶校验位(每组的第8位作为奇偶校验位),产生最大64位的分组大小。这是一个迭代的分组密码,使用称为Feistel的技术,其中将加密的文本块分为两半,使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去。但最后一个循环不交换。DES使用16轮循环,使用异或、置换、代换、移位操作四种基本运算。

而3DES就是对数据块进行三次DES算法加密来进行加固。

代码如下:

public static String COMMON_KEY = "843ce";//密钥
public static byte[] desEncrypt(String msg, String salt) {
if (msg == null)
msg = "";
if (salt == null) {
salt = COMMON_KEY;
}
byte[] keyBytes = new byte[8];
int saltLen = salt.length();
byte[] saltBytes = salt.getBytes();//转换成字节数组,这是加密的必要步骤!
for (int i = 0; i < 8; i++) {
keyBytes[i] = saltBytes[i % saltLen];
}
try {
DESKeySpec keySpec = new DESKeySpec(keyBytes);
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec);
Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
desCipher.init(Cipher.ENCRYPT_MODE, key);
byte[] text = msg.getBytes("UTF-8");
byte[] ciphertext = desCipher.doFinal(text);
return ciphertext;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String desDecrypt(byte[] msg, String salt) {
if (msg == null)
return null;
if (salt == null) {
salt = COMMON_KEY;
}
byte[] keyBytes = new byte[8];
int saltLen = salt.length();
byte[] saltBytes = salt.getBytes();
for (int i = 0; i < 8; i++) {
keyBytes[i] = saltBytes[i % saltLen];
}
try {
DESKeySpec keySpec = new DESKeySpec(keyBytes);
SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec);
Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
desCipher.init(Cipher.DECRYPT_MODE, key);
byte[] deciphertext = desCipher.doFinal(msg);
return new String(deciphertext, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String dumpBytes(byte[] bytes) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
if (i % 32 == 0 && i != 0) {
sb.append("\n");
}
String s = Integer.toHexString(bytes[i]);
if (s.length() < 2) {
s = "0" + s;
}
if (s.length() > 2) {
s = s.substring(s.length() - 2);
}
sb.append(s);
}
return sb.toString();
}
public static byte[] parseBytes(String str) {
try {
int len = str.length() / 2;
if (len <= 2) {
return new byte[] { Byte.parseByte(str) };
}
byte[] arr = new byte[len];
for (int i = 0; i < arr.length; i++) {
arr[i] = (byte) Integer.parseInt(
str.substring(i * 2, i * 2 + 2), 16);
}
return arr;
} catch (Exception e) {
return new byte[0];
}
}
/**
 * 加密
 * 
 * @param encrypt_value
 *            被加密的字符串
 * @param encrypt_key
 *            加密的密钥
 * @return
 */
public static String encryptAsString(String encrypt_value,
String encrypt_key) {
return dumpBytes(desEncrypt(encrypt_value, encrypt_key));
}
/**
 * 解密
 * 
 * @param encrypt_value
 *            要解密的字符串
 * @param encrypt_key
 *            密钥
 * @return
 */
public static String desEncryptAsString(String encrypt_value,
String encrypt_key) {
return desDecrypt(parseBytes(encrypt_value), encrypt_key);
}
时间: 2024-10-03 05:25:58

MD5和3DES加密方式浅析的相关文章

《Java知识应用》Java加密方式(MD5)详解

1. 应用 使用MD5加密 因为:因为MD5的不可逆性,也可以保证你的key 是安全的,黑客无法通过原文和密文知晓你的key. 案例: import java.math.BigInteger; import java.security.MessageDigest; public class MD5Util{ /** * 使用MD5加密 * @param plainText * @return */ public static String encryptionByMD5(String plain

android环境下两种md5加密方式

在平时开发过程中,MD5加密是一个比较常用的算法,最常见的使用场景就是在帐号注册时,用户输入的密码经md5加密后,传输至服务器保存起来.虽然md5加密经常用,但是md5的加密原理我还真说不上来,对md5的认知目前仅仅停留在会使用的水平,想搞清楚还是要花点时间的,这是md5加密算法的相关介绍.本文主要介绍android平台下两种md5加密方式,分别为基于java语言的md5加密及ndk环境下基于c语言的md5加密. 下面代码为基于java语言的md5加密: public String getMD5

[android]DES/3DES/AES加密方式

DES 支持8位加密解密,3Des支持24位,Aes支持32位.3Des是Des算法做三次.位数的单位是字节byte.不是bits. 3Des是把24位分成3组.第一组八位用来加密,第二组8位用于解密,第三组8位用于加密,所以.假设秘钥为123456781234567812345678(3组1-8),则相当于做了一次12345678的Des加密.比如:第一次用12345678秘钥对123进行加密得到 "LDiFUdf0iew=",然后用第二组的12345678对其进行解密(逆向加密过程

laravel5.4 登录注册MD5加密方式教程

上次写过一篇文章<laravle5.4修改成MD5验证加密方式>,这样做有一个缺点,是把整个框架的加密方式都修改了,今天分享的是针对注册登录的MD5加密方式,不影响其他hash加密. 转载请注明(B5教程网)原文链接:http://www.bcty365.com/content-153-5886-1.html 具体步骤如下 1.在app目录下,新建一个文件Libraries,在Libraries目录下新建一个MD5.php文件,里面代码如下: <?php namespace App\Li

laravle5.4修改成MD5验证加密方式

今天在做laravel项目的时候,需要做成md5加密的方式验证,那如何在不修改已有的源码去重构一下呢. 注:下面修改的代码做法,会把整个框架的加密方式全部修改,请根据自己的项目需求而定. 如果只要修改登录注册看这篇文章<laravel5.4登录注册MD5加密验证方法> 转载请注明(B5教程网)原文链接:http://www.bcty365.com/content-153-5884-1.html 1. 在app/下创建一个MD5/文件夹.里面创建一个MD5Hasher类(MD5Hasher.ph

MD5加密方式

MD5加密是一种安全系数比较高的加密方式,具有不可逆的加密特征,就是很难进行破解,现在对MD5加密进行破解的方式还是采用跑数据库的方式,时间比较长,耗费性能比较大,所以一般的破解都是要收费的. C#中的MD5加密使用微软提供的MD5加密的类进行实现,具体如下: public class MD5Encrypt { public static string Encrypt(string str) { MD5 md5 = MD5.Create(); byte[] bytes = Encoding.UT

iOS经常使用加密方式(MD5,AES,BASE64)与网络数据安全

演示样例项目下载地址  https://github.com/cerastes/Encryption 1MD5 创建MD5类 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSString *)md5HexDigest:(NSString *)input; @end #import "CJMD5.h" #import <CommonCrypto/CommonDigest.h> @i

PHP比md5更安全的加密方式--哈希密码

传统加密方式: md5(密码+盐值); $passwordString='your password';//你的密码 $salt="your salt value";//盐值,增加复杂度(随机字串) $md5Password=md5($passwordString.$salt); 从理论上来说,md5不可逆,算是一种比较安全的加密方式.但是我要提醒的是,md5早在04年的时候就被中国人破解(请自行搜索山东大学王小云).一旦被人拖库的化,密码泄漏的可能性极大. 现在推荐一种新的处理方式:

c#进行MD5加密方式和解密算法

--------------- 因为加密个解密都需要用到key所有在加密的后需要把key和加密码都存到数据库中 /// <summary> /// 唯一加密方式 /// </summary> /// <param name="texts"></param> /// <returns></returns> public static string WeiJiaMiGuid(string texts) { string