精华内容
下载资源
问答
  • 近期在项目中遇到一个,MD5加密出现错误,出现了有可能是31位的情况,仔细一对比,两个加密后的字符串差别不大,只是前面少了一个0 。 首先看错误的加密方式 public static String getMD5String(String str) { ...

    近期在项目中遇到一个,MD5加密出现错误,出现了有可能是31位的情况,仔细一对比,两个加密后的字符串差别不大,只是前面少了一个0 。

    首先看错误的加密方式 

    	public static String getMD5String(String str) {
            try {
                // 生成一个MD5加密计算摘要
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 计算md5函数
                md.update(str.getBytes("UTF-8"));
                // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
                // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
                //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
                byte[] digest = md.digest();
                for (byte b : digest) {
                    /** 为什么要打印这里主要是看是否有错误,查看后确实是这里有一定的问题
                    * 特别是第一个加密串, 只有一位,为什么会这样呢因为加密处理确实只有一位,如果正                
                    * 常的话应该是 0+某个数字。但是却被省略了。当然可以自己加上0,再处理就行。
                    * 个人不介意这样,下面上正确的代码
                    */
    				System.out.println(b);
    			}
                BigInteger bigInteger = new BigInteger(1, digest);
                System.out.println(bigInteger);
                return bigInteger.toString(16);
            } catch (Exception e) {
               e.printStackTrace();
               return null;
            }
        }

    正确的 大小、小写一起,其实只是换了传的参数而已

    	public static String MD5Small(String str) {
    		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    		return md5(str, hexDigits);
    	}
    	
    	public static String MD5Large(String large) {
    		char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
    		return md5(large, hexDigits);
    	}
    	
    	private static String md5(String large,char[] hexDigits) {
    		try {
    			MessageDigest mdInst = MessageDigest.getInstance("MD5");
    			mdInst.update(large.getBytes("UTF-8"));
    			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 "";
    		}
    	}

     

    展开全文
  • 引言 在和银行进行数据传输的时候, 签名采用了参数MD5的方式,具体做法... 这让我一时半会有些不解啊,最后我对比成功和失败的签名发现,失败的签名竟然只有31位,而MD5 一般16位或者32位,那么问题肯定出现在

    引言

    在和银行进行数据传输的时候, 签名采用了参数MD5的方式,具体做法参考我的博客《请求参数按照ASCII码从小到大排序后追加秘钥再进行加密得到签名值》

    由于在和行内进行交互的时候,起作用的一些 接口并没有采用验签的环节,所以签名的问题也一直没有暴露 出来,最近要上一个新接口,需要用到签名,在进行批量测试的时候,有些数据签名验证失败,而大部分数据是可以验签成功的, 这让我一时半会有些不解啊,最后我对比成功和失败的签名发现,失败的签名竟然只有31位,而MD5 一般是16位或者32位,那么问题肯定是出现在工具类代码上。

    原始代码,bug代码:

    /**
         * 对字符串进行MD5加密
         *
         * @param str 需要加密的字符串
         * @return 小写MD5字符串 32位
         */
        static public String MD5(String str) {
            MessageDigest digest;
     
            try {
                digest = MessageDigest.getInstance("MD5");
                digest.update(str.getBytes());
                return new BigInteger(1, digest.digest()).toString(16);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                return null;
            }

    上面代码有bug是因为,在转换成字符串的时候,如果首位是两个0,这会 只保留一位数,这就导致生成的MD5只有31位。

    正确代码:

     public static String toMd5(String str) {
            String re = null;
            byte encrypt[];
            try {
                byte[] tem = str.getBytes();
                MessageDigest md5 = MessageDigest.getInstance("md5");
                md5.reset();
                md5.update(tem);
                encrypt = md5.digest();
                StringBuilder sb = new StringBuilder();
                for (byte t : encrypt) {
                    String s = Integer.toHexString(t & 0xFF);
                    if (s.length() == 1) {
                        s = "0" + s;
                    }
                    sb.append(s);
                }
                re = sb.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return re;
        }

     

    展开全文
  •  Console.WriteLine("进行MD5加密的字符串为:" + source + " 加密的结果:" + hash + ".")  Console.WriteLine("验证哈希...")  If verifyMd5Hash(source, hash) Then  Console.WriteLine("哈希值相同的。...
  • 再谈MD5

    2016-03-14 16:13:06
    实习的第一天,项目经理给了个小问题,我这个C#的MD5加密算法出来的结果只有31位,有时也有32位,你用java实现一下,也必须要有31位或者32位的情况。好吧,仔细分析了下31位结果产生的原因,当8位的字节进行16进制...
    实习的第一天,项目经理给了个小问题,我这个C#的MD5加密算法出来的结果只有31位,有时也有32位,你用java实现一下,也必须要有31位或者32位的情况。好吧,仔细分析了下31位结果产生的原因,当8位的字节进行16进制转换时,如果前面四位产生的结果为0,那么后面最后的结果可能就把0省略掉了,也就是0X0A会变成0XA。其实内心是崩溃的,输出成标准的32位不是最好的吗?好吧,还是来整理一下。
    先看一下项目经理给的C#代码:
     public static string MD5Encryption(string source, string key)
            {
                string temp = source + key;
                MD5 md5 = new MD5CryptoServiceProvider();
                byte[] fromData = System.Text.Encoding.Unicode.GetBytes(temp);
                byte[] targetData = md5.ComputeHash(fromData);
                string byte2String = null;
                for (int i = 0; i < targetData.Length; i++)
                {
                    byte2String += targetData[i].ToString("x");
                }
                return byte2String;
            }
    现在的目标情况是,需要把它翻译成java代码,代码如下:
    /**
      * MD5加密
      * @param str
      * @return 
      */
     public static String encrypt(String source ,String key){
            //输入字符串
      String str = source + key;
      //返回字符串
      String str_return = null;
      try {
       
      MessageDigest md = MessageDigest.getInstance("MD5");
      //依据数组的编码方式得到待加密的数组,注意编码方式,你的可能会有不同
      byte[]byte_temp=str.getBytes("UTF-16LE");
      
      md.update(byte_temp);  
      
      byte b[] = md.digest();
      //进行转换
      str_return = byte2hex(b);
      
      } catch (Exception e){
      }
      
      return str_return;
     }

    /**
         *
         * @param b
         * @return
         */
        public static String byte2hex(byte[] b) {
      //进行二进制转16进制后返回的字符串
         String hs = ""; 
         //进行单个字节进行转换的局部字符串
         String stmp = ""; 
         //迭代进行转换
         for (int n = 0; n < b.length; n++) { 
            //对于数组中每个元素进行转换得到16进制编码
            stmp = (Integer.toHexString(b[n] & 0XFF));
            //转换后添加到返回字符串末尾
            hs += stmp;        
          } 
         return hs.toLowerCase();
        }
    这样产生的结果就跟C#代码一样的了。
    但是这样其实是不好的,我们更想要一些标准的结果:32位的。
    采用如下的方法就好了:
    public static String getMD5(String str) {
    byte[] source = str.getBytes();
    String s = null;
    char hexDigits[] = {     
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',  'e', 'f'}; 
    try
    {
    java.security.MessageDigest md = java.security.MessageDigest.getInstance( "MD5" );
    md.update( source );
    byte tmp[] = md.digest();         

    char str[] = new char[16 * 2];   
    int k = 0;                               
    for (int i = 0; i < 16; i++) {         
    byte byte0 = tmp[i];                
    str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
    str[k++] = hexDigits[byte0 & 0xf];            
    }

    s = new String(str);                        

    }catch( Exception e ){
    e.printStackTrace();
    }
    但是在这里,一定要注意理解
    str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
    str[k++] = hexDigits[byte0 & 0xf];    
    的含义是什么。第一句的意思是取字节的左四位然后转换成16进制,第二句话的意思是后四位再转换成16进制。
    这样就好理解了。
    展开全文
  • c# 加密和解密相关代码

    热门讨论 2011-09-06 11:04:59
    列值,MD5 算法的散列值为128 。本实例演示如何使用MD5 算法对用户 输入的密码进行加密,实例运行效果如图19.2 所示。 关 键技术 本实例在实现时主要用到了MD5类的ComputeHash 方法,下面对其进行详细讲解。 MD5 ...
  • 第一步一个MD5加密,后面密文,用在线解密工具解密 工具网址:link 输入en5oy就进入到下一步,一个三元方程组 因为我一个纯小白,所以我自己拿笔解的 X=74 Y=68 Z=31 百度了其他大佬的writeup,其中一...

    2020年第二届网鼎杯网络安全大赛青龙组 crypto boom


    Boom
    在这里插入图片描述
    运行小程序,继续
    在这里插入图片描述
    第一步是一个MD5加密,后面是密文,用在线解密工具解密
    工具网址:link
    在这里插入图片描述
    输入en5oy就进入到下一步,是一个三元方程组
    在这里插入图片描述
    因为我是一个纯小白,所以我是自己拿笔解的
    X=74
    Y=68
    Z=31
    百度了其他大佬的writeup,其中一位用了在线的方程组计算器,嘶,我也随便百度了一个
    工具网址:link
    在这里插入图片描述
    全部输入进入下一步
    在这里插入图片描述
    又是计算题,不过这一串数字有点长,奈何我编程语言不太好,所以我还是用了最原始的方法,计算器
    在这里插入图片描述
    但是这里的结果是不对的(其实按正常思路0.9直接进1也就行了哈),后来在提交答案的时候发现正确的是89127561。
    这里再借用一下其他作者writeup的代码

    import math
    print("ax*x+bx+c=0")
    a=float(input("输入a:"))
    b=float(input("输入b:"))
    c=float(input("输入c:"))
    p=b*b-4*a*c
    if p<0:
        print("无")
        exit()
    else:
        x1 = (-b+math.sqrt(p))/(2*a)
        x2 = (-b-math.sqrt(p))/(2*a)
    print("第一个解: "+str(x1),"第二个解: "+str(x2))
    

    原文链接

    回车提交x的值后,窗口直接关闭了,也不知道结果是不是正确,所以我想着看一下程序的代码,但是又不会,所以试着用notepad++打开看了下,打开后大部分是乱码,然后又试着查找flag
    ctrl+f,快速查找
    得到的这一串应该就是flag的格式了,将各个值对应就得到flag{en5oy_746831_89127561}
    再补充两个方法,用OllyDbg反汇编工具调试可以直接得到flag
    在这里插入图片描述
    或者是用CMD直接运行boom.exe

    在这里插入图片描述

    展开全文
  • getAppSignatureMD5 : 获取应用签名的的 MD5 值 getAppInfo : 获取 App 信息 getAppsInfo : 获取所有已安装 App 信息 关于数组的各种排序算法 -> ArrayUtils.java            回到目录 ...
  • 精易模块[源码] V5.15

    2015-03-21 22:03:37
    MD5:E31C357200B0CA8994D373FD7298CE95 精易模块 V3.88 what’s new:(20141101) 1、为“网页_访问”和“网页_访问_对象”增加了HEAD方法。 2、修正“目录_复制”在线程未初始化,导致对象不能创建的问题,感谢...
  • rar压缩软件.rar

    2016-02-13 10:52:44
    RAR='-s -md1024' export RAR RAR 将使用这个字符串作为命令行的默认参数,并将使用 1024KB 字典大小来创建 “固实”压缩文件。 RAR 控制选项使用下列优先级: 命名行开关 最高优先级 在 RAR 变量中的开关 ...
  • WinRAR_4.0.exe

    2011-02-04 11:34:33
    * 对于文本、声音、图像和 32 和 64 Intel 可执行程序压缩的特殊优化算法 * 获得比类似工具更好的压缩率,使用'固实'压缩 * 身份校验(只有注册版本可用) * 自解压压缩文件和分卷压缩(SFX) * 对物理损伤的...
  • SuperNotepad

    2012-11-14 11:23:53
    【校 验】︰MD5: 68F54DC19E37B17417F47A7DA6707820  SHA1: 01709CB64B0BA21EDD4C0B808384A8590480167F 【SuperNotePad.exe 说明】︰ ---------------------- 1.主程序大小132 KB (135,680 字节); 2.代码高效,...
  • RFC2085 具有重放预防的HMAC-MD5 IP 身份验证 RFC2088 IMAP4非同步字符 RFC2095 简单挑战/回应的IMAP/POP授权扩展 RFC2096 IP面向表格管理系统库(MIB) RFC2101 IPv4 今天地址行为 RFC2104 HMAC:键入-散列法用于...
  • MD5/SHA-1校验码 官方SHA-1校验码截图 ndk-r11b 32 64 64 64 Win:b42da395440cc1c5dc4eeeb383679331addeb3ea 480eca1b29cfe73a5b35374730e6a82ca65c2aa6 Mac: c64fb355fec4da57d329ab45bf0aa29a1aec58...
  • 实例286 MD5加密 412 实例287 RSA加密 419 实例288 DES加密 420 实例289 RC4加密 424 实例290 SHA1加密 427 实例291 恺撒加密 432 第11章 游戏 435 实例292 猜数字游戏 436 实例293 24点游戏 438...
  • 实例125 单个用户密码重置功能(MD5加密) 实例126 以传参方式批量更新供求信息发布时间 实例127 动态组合SQL语句方式实现批量更新 实例128 删除单条供求信息,并弹出删除提示 实例129 后台管理中批量删除发布...
  • 实例125 单个用户密码重置功能(MD5加密) 实例126 以传参方式批量更新供求信息发布时间 实例127 动态组合SQL语句方式实现批量更新 实例128 删除单条供求信息,并弹出删除提示 实例129 后台管理中批量删除发布...
  • RFC中文文档-txt

    2009-09-11 14:56:56
    RFC2085 具有重放预防的HMAC-MD5 IP 身份验证 RFC2088 IMAP4非同步字符 RFC2095 简单挑战/回应的IMAP/POP授权扩展 RFC2096 IP面向表格管理系统库(MIB) RFC2101 IPv4 今天地址行为 RFC2104 HMAC:键入-散列法用于信息...
  • 中文版RFC,共456

    2009-04-19 22:56:29
    RFC2085 具有重放预防的HMAC-MD5 IP 身份验证 RFC2088 IMAP4非同步字符 RFC2095 简单挑战/回应的IMAP/POP授权扩展 RFC2096 IP面向表格管理系统库(MIB) RFC2101 IPv4 今天地址行为 RFC2104 HMAC:键入-散列法用于信息...
  • RAR='-s -md1024' export RAR RAR 将使用这个字符串作为命令行的默认参数,并将使用 1024KB 字典大小来创建 “固实”压缩文件。 RAR 控制选项使用下列优先级: 命名行开关 最高优先级 在 RAR 变量...
  • 实例155 使用MD5算法对密码进行加密 实例156 恺撒密码算法的实现 第2篇 Windows窗体篇 第7章 Windows窗体基础 7.1 设置窗体位置 实例157 控制窗体加载时的位置 实例158 设置窗体在屏幕中的位置 实例159 从...
  • 实例155 使用MD5算法对密码进行加密 实例156 恺撒密码算法的实现 第2篇 Windows窗体篇 第7章 Windows窗体基础 7.1 设置窗体位置 实例157 控制窗体加载时的位置 实例158 设置窗体在屏幕中的位置 实例159 从...
  • 实例155 使用MD5算法对密码进行加密 实例156 恺撒密码算法的实现 第2篇 Windows窗体篇 第7章 Windows窗体基础 7.1 设置窗体位置 实例157 控制窗体加载时的位置 实例158 设置窗体在屏幕中的位置 实例159 从...
  • 书中实例来源于多工程师的多年积累,具有很强的实用性。 本书第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为核心,介绍了应用Visual Basic进行程序开发的多方面的知识和技巧,主要包括Visual...
  • 书中实例来源于多工程师的多年积累,具有很强的实用性。 本书第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为核心,介绍了应用Visual Basic进行程序开发的多方面的知识和技巧,主要包括Visual...
  •  实例155 使用MD5算法对密码进行加密 201 实例156 恺撒密码算法的实现 202 第2篇 Windows窗体篇 第7章 Windows窗体基础 206 7.1 设置窗体位置 207  实例157 控制窗体加载时的位置 207  实例158 设置...
  • 实例155 使用MD5算法对密码进行加密 201 实例156 凯撒密码算法的实现 202 第2篇 Windows窗体篇 第7章 Windows窗体基础 206 7.1 设置窗体位置 207 实例157 控制窗体加载时的位置 207 实例158 设置窗体在屏幕中的位置 ...
  • CISCO 技术大集合

    2013-05-22 01:07:13
    IP地址分为网络地址和主机地址二个部分,A类地址前8为网络地址,24为主机地址,B类地址16为网络地址,16为主机地址,C类地址前24为网络地址,8为主机地址,网络地址范围如下表所示: 种类 网络...
  • 6.9.3 使用MD5加密 118 6.9.4 提供你自己的鉴权算法 118 6.10 杂项设置 119 6.11 附加工具 120 6.11.1 查看键值 120 6.11.2 导入之前版本的配置 120 6.12 小结 122 第7章 读写数据 123 7.1 ...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    举例而言,如要挂载下列5个设备,其执行指令可能如下 (假设都Linux的ext2系统,如果Windows XX请将ext2改成vfat): 软盘 ===>mount -t ext2 /dev/fd0 /mnt/floppy cdrom ===>mount -t iso9660 /dev/hdc /mnt/...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

md5加密后是31位