Base64(DES(MD5(消息体) + 消息体))加密&解密

原创 2012年03月29日 09:52:28

零、   首先明确一下概念(simple what?):
MD5:摘要算法,不可逆
DES:对称加密算法,用密钥可以解密(可逆)
BASE64:编码算法,可逆

一、 Base64(DES(MD5(消息体) + 消息体))加密 (How 原理)

 Des加密保证消息的不可阅读性。

对消息的加密算法:Base64(DES(MD5(消息体) + 消息体))

消息采用的DES加密算法规则如下:

1.密钥是一个长度16、由16进制字符组成的字符串,如:1234567890ABCDEF

     使用时,相临的两位理解为一个16进制数的明文,然后转换为实际使用的8位密钥

2. 待加密数据按照PKCS5规则进行补位。(缺7位补7个0x07,缺6位则补6个0x06,以次类推,如果正好8位,也需要补8个0x08)

3. 实际加密模式选择DES-ECB

4. 经过DES加密后的数据必须通过Base64编码转换为明文的字符串


二、Base64(DES(MD5(消息体) + 消息体))加密 (How 原理)

请楼主证实一个说法:你说“我有一个密码”,是指加密用的“密钥”?还是指最后得到的“密文”?

  如果没有“密钥”,是无法还原出“消息体”的,因为 DES 解密需要“密钥”。
所以,解决解密问题:
1. 用BASE64还原算法得到“DES(MD5(消息体) + 消息体)”
2. 用你手里的密钥进行DES解密,得到“MD5(消息体) + 消息体”
3. 剥掉前面的 16 个字节,得到“消息体”
4. (可选步骤)对“消息体”进行 MD5 计算,得到 16 字节的摘要信息,跟前面剥掉的 16 个字节进行比较,如果一致的话,表示整个过程成功。


三、Java版加密和解密实现: (How 实践/具体如何做)

  import java.security.SecureRandom;

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

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class EncryptOrDecrypt {
private static BASE64Decoder base64Decoder = new BASE64Decoder();
private static BASE64Encoder base64Eecoder = new BASE64Encoder();

/*
* 加密
*/
public static String EncryptString(String strText, String sKey) {
   // MD5加密
   String md5s = EncryptMD5.getMD5(strText);
   try {
    SecureRandom random = new SecureRandom();
    byte[] bkey = getKey(sKey);
    DESKeySpec deskey = new DESKeySpec(bkey);
    // 创建一个密钥工厂,然后用它把DESKeyspec转换成
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    SecretKey securekey = keyFactory.generateSecret(deskey);
    // cipher对象实际完成加密操作
    Cipher cipher = Cipher.getInstance("DES");
    // 用密钥初化Cipher对象
    cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
    // 现在,获取数据并加密
    // 正式执行加密操作
    String str = md5s + strText;
    byte[] t = str.getBytes("UTF-8");
    byte[] bResult = cipher.doFinal(t);
    // 1、加密完byte[] 后,需要将加密了的byte[] 转换成base64保存,如:
    // BASE64Encoder base64encoder = new BASE64Encoder();
    // String encode=base64encoder.encode(bytes);
    return base64Eecoder.encode(bResult);

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

/*
* 解密
*/
public static String DecryptString(String strText, String sKey)
    throws Exception {
   // DES算法要求有一个可信任的随机数源
   SecureRandom random = new SecureRandom();
   // 创建一个DesKeySpec对象
   byte[] bkey = getKey(sKey);
   DESKeySpec desKey = new DESKeySpec(bkey);
   // 创建一个密钥工厂
   SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
   // 将DESKeySpec对象转换成SecretKey对象
   SecretKey secreKey = keyFactory.generateSecret(desKey);
   // Cipher对象实际完成解密操作
   Cipher cipher = Cipher.getInstance("DES");
   // 用密钥初始化Cipher对象
   cipher.init(Cipher.DECRYPT_MODE, secreKey, random);
   // 真正开始解密
   // 2、解密前,需要将加密后的字符串从base64转回来再解密,如:
   // BASE64Decoder base64decoder = new BASE64Decoder();
   // byte[] encodeByte = base64decoder.decodeBuffer(s);

   byte[] encodeByte = base64Decoder.decodeBuffer(strText);
   byte[] b = cipher.doFinal(encodeByte);
   String s = new String(b);

   return s.substring(32);
}

public static byte[] getKey(String key) {
   byte[] b = new byte[8];
   for (int i = 0; i < 8; i++) {
    b[i] = (byte) (0xff & Integer.parseInt(key.substring(i * 2,
      i * 2 + 2), 16));
   }
   return b;
  }
}


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/*
* MD5加密
*/
public class EncryptMD5 {
private static MessageDigest msgdig = null;

public static final synchronized String getMD5(String s) {
   if (msgdig == null)
    try {
     msgdig = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
     System.err
       .println("Failed to load the MD5 MessageDigest. Jive will be unable to function normally.");
     e.printStackTrace();
    }
   msgdig.update(s.getBytes());
   return toHex(msgdig.digest());

}

public static final String toHex(byte byteArray[]) {
   StringBuffer sb = new StringBuffer(byteArray.length * 2);
   for (int i = 0; i < byteArray.length; i++) {
    if ((byteArray[i] & 0xff) < 16)
     sb.append("0");
    sb.append(Long.toString(byteArray[i] & 0xff, 16));
   }
   return sb.toString();
}
}



四、  参考:

1 Base64(DES(MD5(消息体) + 消息体))解密 

2 Java DES+MD5加密和解密 http://hi.baidu.com/redlineren/blog/item/304bd51796d44d07c83d6da2.html

3 Java MD5加密方法  http://hi.baidu.com/redlineren/blog/item/3af945822e5efaac0df4d2a1.html


相关文章推荐

Base64,DES,RSA,SHA1,MD5笔记

1,Base64 场景:你想把一组二进制数据表示为一组可见字符,这样在某些场合更加利于传输,比如在邮件中传输。 算法:http://zh.wikipedia.org/wiki/Base64 2,...
  • cubesky
  • cubesky
  • 2014年08月22日 11:47
  • 873

【加密】DES加密解密算法

一、前言 近几天,小编在项目中遇到了加密解密的这些技术,以前也接触过MD5加密解密算法。我说用MD5做得了,同组开发的崔哥说MD5不可逆,研究一下其他的加密解密的算法。然后就在网上找了DES的算法。...

[安卓开发] WebView网页隐藏屏蔽广告元素标签|去除底部广告

简介有时候,我们用WebView加载的某些网页里面常常有广告,大大的影响了使用者的浏览效果,我们能不能去除呢? 答案当然是可以的,当然方法是偏门一点,是利用js把对应的广告块进行隐藏。。js代码doc...

Java加密解密快速入门上篇【包括MD5、BASE64、DES、RSA等算法】

搞Java的攻城狮应该比较欣喜若狂的,不仅Sun公司的JDK提供了庞大的类库,而且还有众多的开源组织和个人不断地丰富着Java的生态系统。没错的,诸如MD5、BASE64、DES、RSA等经典加密解密...

Android---MD5+BASE64+DES3加密解密

MD5类的加密和解密就不用说了,DES加密解密的过程需要你的加密内容和密钥配合使用,而引入BASE64的作用就是为了防止在传输过程中加密内容的丢失,出现IllegalBlockSizeExceptio...

openssl学习篇之base64编码、解码;md5 摘要;sha1摘要;3des加密,解密;rsa算法

openssl学习篇之base64编码、解码 完善在上一篇 “openssl学习篇之base64编码、解码中有写出实现的代码, 经实际的运行中,发现如果字符串长超过47会产生BUG,返回空,所以修正了...

Base64、MD5、DES、AES、RAS加密解密编码解码分析

概念: 编码 解码  防止中文乱码 加密 解密  安全性  将明文---密文(看不懂) Base64   概念:Base64编码可用于在HTTP环境下传递较长的标识信息 ...

2.2.2 Android Base64,Hex,URLEncoding编码和解码,以及AES,DES,MD5加密和解密的工具类

Android Base64,Hex,URLEncoding编码和解码,以及AES,DES,MD5加密和解密的工具类
  • Rodulf
  • Rodulf
  • 2016年02月18日 23:51
  • 1346

Java加密/解密算法快速入门上篇[包括MD5、BASE64、DES、RSA等]

Java工程师应该比较欣喜若狂的,不仅Sun公司的JDK提供了庞大的类库,而且还有众多的开源组织和个人不断地丰富着Java的生态系统。没错的,诸如MD5、BASE64、DES、RSA等经典加密解密算法...

python中常用的base64 md5 aes des crc32等的加密解密

python中常用的base64 md5 aes des crc32等的加密解密转自:http://www.cnblogs.com/darkpig/p/5676076.html1.base64Pyth...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Base64(DES(MD5(消息体) + 消息体))加密&解密
举报原因:
原因补充:

(最多只允许输入30个字)