Java与C++实现相同的MD5加密算法简单实例

1、Java版

package com.lyz.utils.common; 

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
 * MD5加密
 * @author liuyazhuang
 */
public class MD5Hash { 

  public static String md5Java(String message) {
    String digest = null;
    try {
      MessageDigest md = MessageDigest.getInstance("MD5");
      byte[] hash = md.digest(message.getBytes("UTF-8")); 

      //converting byte array to Hexadecimal String
      StringBuilder sb = new StringBuilder(2 * hash.length);
      for (byte b : hash) {
        sb.append(String.format("%02x", b & 0xff));
      } 

      digest = sb.toString(); 

    } catch (UnsupportedEncodingException ex) {
      //Logger.getLogger(StringReplace.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchAlgorithmException ex) {
      //Logger.getLogger(StringReplace.class.getName()).log(Level.SEVERE, null, ex);
    }
    return digest;
  }
  public static void main(String[] args) {
    System.out.println(md5Java("admin").toUpperCase());
  }
}

2、C++代码

(1)md5.h

#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>
#include  <string.h>
void  MD5Digest(char  *pszInput,  unsigned  long  nInputSize,  char  *pszOutPut);

(2)md5.cpp

#include  <stdio.h>
#include  <stdlib.h>
#include  <time.h>
#include  <string.h>
#include  "md5.h"

typedef  unsigned  char  *POINTER;
typedef  unsigned  short  int  UINT2;
typedef  unsigned  long  int  UINT4; 

typedef  struct
{
 UINT4  state[4];
 UINT4  count[2];
 unsigned  char  buffer[64];
}  MD5_CTX; 

void  MD5Init(MD5_CTX  *);
void  MD5Update(MD5_CTX  *,  unsigned  char  *,  unsigned  int);
void  MD5Final(unsigned  char  [16],  MD5_CTX  *); 

#define  S11  7
#define  S12  12
#define  S13  17
#define  S14  22
#define  S21  5
#define  S22  9
#define  S23  14
#define  S24  20
#define  S31  4
#define  S32  11
#define  S33  16
#define  S34  23
#define  S41  6
#define  S42  10
#define  S43  15
#define  S44  21 

static  unsigned  char  PADDING[64]  =  {
 0x80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
}; 

#define  F(x,  y,  z)  (((x)  &  (y))  |  ((~x)  &  (z)))
#define  G(x,  y,  z)  (((x)  &  (z))  |  ((y)  &  (~z)))
#define  H(x,  y,  z)  ((x)  ^  (y)  ^  (z))
#define  I(x,  y,  z)  ((y)  ^  ((x)  |  (~z))) 

#define  ROTATE_LEFT(x,  n)  (((x)  <<  (n))  |  ((x)  >>  (32-(n)))) 

#define  FF(a,  b,  c,  d,  x,  s,  ac)  {   (a)  +=  F  ((b),  (c),  (d))  +  (x)  +  (UINT4)(ac);   (a)  =  ROTATE_LEFT  ((a),  (s));   (a)  +=  (b);    }
#define  GG(a,  b,  c,  d,  x,  s,  ac)  {   (a)  +=  G  ((b),  (c),  (d))  +  (x)  +  (UINT4)(ac);   (a)  =  ROTATE_LEFT  ((a),  (s));   (a)  +=  (b);    }
#define  HH(a,  b,  c,  d,  x,  s,  ac)  {   (a)  +=  H  ((b),  (c),  (d))  +  (x)  +  (UINT4)(ac);   (a)  =  ROTATE_LEFT  ((a),  (s));   (a)  +=  (b);    }
#define  II(a,  b,  c,  d,  x,  s,  ac)  {   (a)  +=  I  ((b),  (c),  (d))  +  (x)  +  (UINT4)(ac);   (a)  =  ROTATE_LEFT  ((a),  (s));   (a)  +=  (b);  } 

inline  void  Encode(unsigned  char  *output,  UINT4  *input,  unsigned  int  len)
{
 unsigned  int  i,  j; 

 for  (i  =  0,  j  =  0;  j  <  len;  i++,  j  +=  4)  {
  output[j]  =  (unsigned  char)(input[i]  &  0xff);
  output[j+1]  =  (unsigned  char)((input[i]  >>  8)  &  0xff);
  output[j+2]  =  (unsigned  char)((input[i]  >>  16)  &  0xff);
  output[j+3]  =  (unsigned  char)((input[i]  >>  24)  &  0xff);
 }
} 

inline  void  Decode(UINT4  *output,  unsigned  char  *input,  unsigned  int  len)
{
 unsigned  int  i,  j; 

 for  (i  =  0,  j  =  0;  j  <  len;  i++,  j  +=  4)
  output[i]  =  ((UINT4)input[j])  |  (((UINT4)input[j+1])  <<  8)  |
 (((UINT4)input[j+2])  <<  16)  |  (((UINT4)input[j+3])  <<  24);
} 

inline  void  MD5Transform  (UINT4  state[4],  unsigned  char  block[64])
{
 UINT4  a  =  state[0],  b  =  state[1],  c  =  state[2],  d  =  state[3],  x[16];
 Decode  (x,  block,  64);
 FF  (a,  b,  c,  d,  x[  0],  S11,  0xd76aa478);
 FF  (d,  a,  b,  c,  x[  1],  S12,  0xe8c7b756);
 FF  (c,  d,  a,  b,  x[  2],  S13,  0x242070db);
 FF  (b,  c,  d,  a,  x[  3],  S14,  0xc1bdceee);
 FF  (a,  b,  c,  d,  x[  4],  S11,  0xf57c0faf);
 FF  (d,  a,  b,  c,  x[  5],  S12,  0x4787c62a);
 FF  (c,  d,  a,  b,  x[  6],  S13,  0xa8304613);
 FF  (b,  c,  d,  a,  x[  7],  S14,  0xfd469501);
 FF  (a,  b,  c,  d,  x[  8],  S11,  0x698098d8);
 FF  (d,  a,  b,  c,  x[  9],  S12,  0x8b44f7af);
 FF  (c,  d,  a,  b,  x[10],  S13,  0xffff5bb1);
 FF  (b,  c,  d,  a,  x[11],  S14,  0x895cd7be);
 FF  (a,  b,  c,  d,  x[12],  S11,  0x6b901122);
 FF  (d,  a,  b,  c,  x[13],  S12,  0xfd987193);
 FF  (c,  d,  a,  b,  x[14],  S13,  0xa679438e);
 FF  (b,  c,  d,  a,  x[15],  S14,  0x49b40821);
 GG  (a,  b,  c,  d,  x[  1],  S21,  0xf61e2562);
 GG  (d,  a,  b,  c,  x[  6],  S22,  0xc040b340);
 GG  (c,  d,  a,  b,  x[11],  S23,  0x265e5a51);
 GG  (b,  c,  d,  a,  x[  0],  S24,  0xe9b6c7aa);
 GG  (a,  b,  c,  d,  x[  5],  S21,  0xd62f105d);
 GG  (d,  a,  b,  c,  x[10],  S22,   0x2441453);
 GG  (c,  d,  a,  b,  x[15],  S23,  0xd8a1e681);
 GG  (b,  c,  d,  a,  x[  4],  S24,  0xe7d3fbc8);
 GG  (a,  b,  c,  d,  x[  9],  S21,  0x21e1cde6);
 GG  (d,  a,  b,  c,  x[14],  S22,  0xc33707d6);
 GG  (c,  d,  a,  b,  x[  3],  S23,  0xf4d50d87);
 GG  (b,  c,  d,  a,  x[  8],  S24,  0x455a14ed);
 GG  (a,  b,  c,  d,  x[13],  S21,  0xa9e3e905);
 GG  (d,  a,  b,  c,  x[  2],  S22,  0xfcefa3f8);
 GG  (c,  d,  a,  b,  x[  7],  S23,  0x676f02d9);
 GG  (b,  c,  d,  a,  x[12],  S24,  0x8d2a4c8a);
 HH  (a,  b,  c,  d,  x[  5],  S31,  0xfffa3942);
 HH  (d,  a,  b,  c,  x[  8],  S32,  0x8771f681);
 HH  (c,  d,  a,  b,  x[11],  S33,  0x6d9d6122);
 HH  (b,  c,  d,  a,  x[14],  S34,  0xfde5380c);
 HH  (a,  b,  c,  d,  x[  1],  S31,  0xa4beea44);
 HH  (d,  a,  b,  c,  x[  4],  S32,  0x4bdecfa9);
 HH  (c,  d,  a,  b,  x[  7],  S33,  0xf6bb4b60);
 HH  (b,  c,  d,  a,  x[10],  S34,  0xbebfbc70);
 HH  (a,  b,  c,  d,  x[13],  S31,  0x289b7ec6);
 HH  (d,  a,  b,  c,  x[  0],  S32,  0xeaa127fa);
 HH  (c,  d,  a,  b,  x[  3],  S33,  0xd4ef3085);
 HH  (b,  c,  d,  a,  x[  6],  S34,   0x4881d05);
 HH  (a,  b,  c,  d,  x[  9],  S31,  0xd9d4d039);
 HH  (d,  a,  b,  c,  x[12],  S32,  0xe6db99e5);
 HH  (c,  d,  a,  b,  x[15],  S33,  0x1fa27cf8);
 HH  (b,  c,  d,  a,  x[  2],  S34,  0xc4ac5665);
 II  (a,  b,  c,  d,  x[  0],  S41,  0xf4292244);
 II  (d,  a,  b,  c,  x[  7],  S42,  0x432aff97);
 II  (c,  d,  a,  b,  x[14],  S43,  0xab9423a7);
 II  (b,  c,  d,  a,  x[  5],  S44,  0xfc93a039);
 II  (a,  b,  c,  d,  x[12],  S41,  0x655b59c3);
 II  (d,  a,  b,  c,  x[  3],  S42,  0x8f0ccc92);
 II  (c,  d,  a,  b,  x[10],  S43,  0xffeff47d);
 II  (b,  c,  d,  a,  x[  1],  S44,  0x85845dd1);
 II  (a,  b,  c,  d,  x[  8],  S41,  0x6fa87e4f);
 II  (d,  a,  b,  c,  x[15],  S42,  0xfe2ce6e0);
 II  (c,  d,  a,  b,  x[  6],  S43,  0xa3014314);
 II  (b,  c,  d,  a,  x[13],  S44,  0x4e0811a1);
 II  (a,  b,  c,  d,  x[  4],  S41,  0xf7537e82);
 II  (d,  a,  b,  c,  x[11],  S42,  0xbd3af235);
 II  (c,  d,  a,  b,  x[  2],  S43,  0x2ad7d2bb);
 II  (b,  c,  d,  a,  x[  9],  S44,  0xeb86d391);
 state[0]  +=  a;
 state[1]  +=  b;
 state[2]  +=  c;
 state[3]  +=  d;
 memset  ((POINTER)x,  0,  sizeof  (x));
 } 

inline  void  MD5Init(MD5_CTX  *context)
{
 context->count[0]  =  context->count[1]  =  0;
 context->state[0]  =  0x67452301;
 context->state[1]  =  0xefcdab89;
 context->state[2]  =  0x98badcfe;
 context->state[3]  =  0x10325476;
} 

inline  void  MD5Update(MD5_CTX  *context,  unsigned  char  *input,  unsigned  int  inputLen)
{
 unsigned  int  i,  index,  partLen; 

 index  =  (unsigned  int)((context->count[0]  >>  3)  &  0x3F);
 if  ((context->count[0]  +=  ((UINT4)inputLen  <<  3))
  <  ((UINT4)inputLen  <<  3))
  context->count[1]++;
 context->count[1]  +=  ((UINT4)inputLen  >>  29); 

 partLen  =  64  -  index; 

 if  (inputLen  >=  partLen)  {
  memcpy((POINTER)&context->buffer[index],  (POINTER)input,  partLen);
  MD5Transform(context->state,  context->buffer); 

  for  (i  =  partLen;  i  +  63  <  inputLen;  i  +=  64)
   MD5Transform  (context->state,  &input[i]);
  index  =  0;
 }
 else
  i  =  0; 

 memcpy((POINTER)&context->buffer[index],  (POINTER)&input[i],  inputLen-i);
} 

inline  void  MD5Final(unsigned  char  digest[16],  MD5_CTX  *context)
{
 unsigned  char  bits[8];
 unsigned  int  index,  padLen; 

 Encode  (bits,  context->count,  8);
 index  =  (unsigned  int)((context->count[0]  >>  3)  &  0x3f);
 padLen  =  (index  <  56)  ?  (56  -  index)  :  (120  -  index);
 MD5Update  (context,  PADDING,  padLen);
 MD5Update  (context,  bits,  8);
 Encode  (digest,  context->state,  16);
 memset  ((POINTER)context,  0,  sizeof  (*context));
 } 

void  MD5Digest(char  *pszInput,  unsigned  long  nInputSize,  char  *pszOutPut)
{
 MD5_CTX  context;
 unsigned  int  len  =  strlen  (pszInput); 

 MD5Init  (&context);
 MD5Update  (&context,  (unsigned  char  *)pszInput,  len);
 MD5Final  ((unsigned  char  *)pszOutPut,  &context);
} 

main()
{ char szDigest[16];
 char encrypt[200];
 printf("请输入要计算MD5值的字符串:");
 gets(encrypt);
 printf("\n加密结果:");
 MD5Digest(encrypt,strlen(encrypt),szDigest);
 int i;
 for (i=0;i<16;i++) printf ("%02X",(unsigned char)szDigest[i]);
 getchar();

}

3、运行效果

这里我们都以输入123456为例

(1)java输出结果如下:

(2)C++输出结果如下:

以上就是小编为大家带来的Java与C++实现相同的MD5加密算法简单实例的全部内容了,希望对大家有所帮助,多多支持我们~

(0)

相关推荐

  • C++/java 继承类的多态详解及实例代码

    C++/java 继承类的多态详解 学过C++和Java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装.继承.多态,所有今天我们就来简单了解一下C++和Java在多态这方面的不同. 首先我们各看一个案例. C++ //测试继承与多态 class Animal { public: char name[128]; char behavior[128]; void outPut() { cout << "Animal" << endl

  • C/C++在Java、Android和Objective-C三大平台下实现混合编程

    Android和iOS开发都支持C++开发,可以一套代码多平台使用.同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率. 一.为什么使用C/C++ 便于移植,用C/C++写得库可以方便在其他的平台上再次使用. 代码的保护,由于java层代码很容易被反编译,而C/C++库反汇难度较大. 提高程序的执行效率,将要求高性能的应用逻辑使用C/C++开发,从而提高应用程序的执行效率. 访问现有开源库,需要访问底层的API或引用一些只有C/C++

  • C++和java设计模式之单例模式

    单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点.其构造过程由自身完成,可以将构造方法定义为private型的,这样外界就只能通过定义的静态的函数Instance()构造实例,这个函数的目的就是返回一个类的实例,在此方法中去做是否有实例化的判断.客户端不再考虑是否需要去实例化的问题,把这些都交给了单例类自身.通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法,就是让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可

  • Java中对象与C++中对象的放置安排的对比

    Java中对象与C++中对象的放置安排的对比 概要: Java中,所有的对象都存放在堆(Heap,一种通用的内存池)中:而对象的引用是存放在堆栈(Stack)中的. 我们可以通过String直接声明的字符串与new String声明出来的字符串使用equals()和"=="进行的比较,从而理解对象和引用的关系及它们的存储位置. 堆栈是一种快速有效的分配存储方法,仅次于寄存器.创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针. 堆不同于堆栈的好处是:

  • Java如何调用C++ DLL库

    最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题.下面是小编通过查阅相关资料,实现的一个简单例子. 1.第一步,先在Java中新建一个类 如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了.然后我们需要dll中实现下面定义的加减乘除方法. 2.编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是eclip

  • C/C++与Java各数据类型所占字节数的详细比较

    C/C++的数据类型: 一,整型 Turbo C:   [signed] int 2Byte//有符号数,-32768~32767   unsigned int 2Byte //无符号数,只能表示整数0~65535 [signed] short [int] 2Byte unsigned short [int] 2 Byte long [int] 4 Byte unsigned long [int] 4 Byte Visual C++ 6.0: [signed] int 4Byte   unsig

  • Java与C++实现相同的MD5加密算法简单实例

    1.Java版 package com.lyz.utils.common; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5加密 * @author liuyazhuang */ public class MD5Hash { public static String md5

  • Java利用Zxing生成二维码的简单实例

    Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法,现在我简单介绍一下使用Java利用Zxing生成与解析二维码 1.二维码的生成 1.1 将Zxing-core.jar 包加入到classpath下. 1.2 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用. import com.google.zxing.common.BitMatrix; i

  • Java实现监控多个线程状态的简单实例

    实例如下: import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * 测试监控类 * * @author * */ public class WatchThread { /** * 测试函数 * * @throws InterruptedException */ public void testThre

  • java读取文件和写入文件的方式(简单实例)

    Java代码 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream in = null; try { System.out.println("以字节为单位读取文件内容,一次读一个字节:"); // 一次读

  • java实现MD5加密算法的实例代码

    复制代码 代码如下: package other; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/* * MD5 算法*/public class MD5 { // 全局数组    private final static String[] strDigits = { "0", "1", "2", "3", &

  • JAVA得到数组中最大值和最小值的简单实例

    今天本文与大家分享如何得到数组中的最大值和最小值的实例.很适合Java初学者复习数组的基本用法与流程控制语句的使用.具体如下: 这个程序主要是求得数组中的最大值和最小值 public class TestJava4_3 { public static void main(String args[]) { int i,min,max; int A[]={74,48,30,17,62}; // 声明整数数组A,并赋初值 min=max=A[0]; System.out.print("数组A的元素包括

  • Java基础之extends用法详解及简单实例

     Java extends用法详解 概要: 理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 class Animal{ void eat(){ System.out.println("Animal eat"); } void sleep(){ System.out.println("Animal sleep"); } vo

  • java 基础教程之多线程详解及简单实例

    java 多线程详解 在这篇文章里,我们关注多线程.多线程是一个复杂的话题,包含了很多内容,这篇文章主要关注线程的基本属性.如何创建线程.线程的状态切换以及线程通信. 线程是操作系统运行的基本单位,它被封装在进程中,一个进程可以包含多个线程.即使我们不手动创造线程,进程也会有一个默认的线程在运行. 对于JVM来说,当我们编写一个单线程的程序去运行时,JVM中也是有至少两个线程在运行,一个是我们创建的程序,一个是垃圾回收. 线程基本信息 我们可以通过Thread.currentThread()方法

  • Javascript和Java获取各种form表单信息的简单实例

    大家都知道我们在提交form的时候用了多种input表单.可是不是每一种input表单都是很简单的用Document.getElementById的方式就可以获取到的.有一些组合的form类似于checkbox或者radio或者select我们如何用javascript获取和在服务器中获取提交过来的参数呢?多说无用.上代码: Jsp-html代码: 复制代码 代码如下: <form action="input.do" name="formkk">   &

  • java 实现MD5加密算法的简单实例

    java 实现MD5加密算法的简单实例 实现代码: import java.security.NoSuchAlgorithmException; public class MD5HashUtil { private MessageDigest md = null; private static MD5HashUtil md5 = null; private static final char[] hexChars ={'0','1','2','3','4','5','6','7','8','9'

随机推荐