java md2_GitHub - edzjx/Md2Crypto
此項目來源一個字謎解體過程
一個程序猿在自己的微信公眾號里出了一個字謎。其中用到了MD2加密算法,這是各很古老的加密算法。從網(wǎng)上搜到作者92年發(fā)布的C代碼還能正常執(zhí)行。此項目介紹解題過程,和使用C,C#,Java,Python3來測試代碼。
文章結(jié)構(gòu)
破題
解體代碼
項目代碼說明
參考引用
題目:黑白皆算,對我等眾猿而言中央C所在位置數(shù)優(yōu)剃愛膚杠吧愛慕帝貳億次的值是?
解:
1.破題
1.1黑白皆算,中央C所在位置(C do)
上圖是一個標準的鋼琴鍵盤示意圖。這句話的意思黑鍵也算,從第一個數(shù)中央C是第40個(每組12按鍵(7個白鍵+5個黑鍵,第一組前有3個按鍵)。
1.2 對我等眾猿而言
意思是從0開始索引,那么C do的位置值是39
1.3優(yōu)剃愛膚杠吧 愛慕帝貳 貳億次 的值
這句話是諧音,實際指的的是 UTF-8 MD2 2億次的值。MD2是歷史悠久一個Hash加密算法,最初用于8位機這種嵌入式設(shè)備上,目前其安全性很低,不建議使用了。建議參考MD2算法作者原文上的測試結(jié)果,來驗證自己語言的加密算法。(網(wǎng)上搜到其作者92年寫的算法原文上面的C代碼我直接拷貝到clan中也照樣執(zhí)行),Hash值這類算法一般輸入是一個字節(jié)數(shù)組。所以UTF-8的意思,以UTF-8編碼格式獲取39的字節(jié)編碼。2億次的意思就說循環(huán)加密2億次。實際上UTF-8對于此題沒有意義,對于0x00-0x7F之間的字符(包含數(shù)字字母),UTF-8編碼與ASCII編碼完全相同。
破題后就是寫代碼來計算了。
2.解題代碼
2.1Python
Python的代碼最為簡潔,我參考52pojie貼子:
from Crypto.Hash import MD2
if __name__ == '__main__':
#print_hi('PyCharm')
txt = "39"
# md2加密2億次 根據(jù)實際題目修改此處的
for i in range(200000000):
txt = MD2.new(txt.encode("utf8")).hexdigest()
print(txt)
需要Python環(huán)境安裝pycryptodome ,使用pip安裝 pip install pycryptodome。hexdigest()作為十六進制數(shù)據(jù)字符串值
2.2Java
需要導(dǎo)入apache.commons.codec庫。我建議建立Maven項目。這樣方便在線導(dǎo)入依賴。否則手工需要去官網(wǎng)下載jar包,再導(dǎo)入jar包。代碼書寫起來簡潔程度不亞于Python。
package com.company;
import org.apache.commons.codec.digest.DigestUtils;
public class Main {
public static void main(String[] args) {
String txt ="39";
// MD2 根據(jù)題目在是1億還是2億進行修改
for(int i=0;i<200000000;i++){
/// public static byte\[\] md2(String data) {
// return md2(StringUtils.getBytesUtf8(data));
// }
txt = DigestUtils.md2Hex(txt);
}
System.out.println(txt);
}
}
2.3CSharp
C#的代碼最為麻煩,首先C#官方庫(System.Security.Cryptography)只有MD5加密算法,另外第三方收費庫Chilkat .NET包含MD2算法,但是價格太貴。還好Mono中有。需要通過Nuget在項目里安裝。再者C#加密類調(diào)用步驟都多一些,而且沒有直接字符輸出的功能。我這對此封裝了方法,一個是進行字符串輸出,一個是封裝加密計算過程。使得最終調(diào)用的風(fēng)格和上述兩個代碼類似。
新建項目后,NutGet 搜索Mono.Security安裝。
using System;
using System.Text;
using Mono.Security.Cryptography;
namespace testdemo
{
class Program
{
static void Main(string[] args)
{
string txt = "39";
for (int i = 0; i < 200000000; i++)
{
txt = Md2Crypto(txt);
Console.WriteLine($"{i:d9}:{txt}");
}
}
public static string Md2Crypto(string source)
{
using (MD2 myMD2 = MD2.Create())
{
try
{
byte\[\] input = Encoding.UTF8.GetBytes(source);
byte\[\] output= myMD2.ComputeHash(input);
//string hashstr = GetHexStrByteArray(output);
return hashstr;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
/// <summary>
/// 官方文檔介紹為了hash后是需要核實后位十六進制字節(jié)數(shù)組,為了方便查看結(jié)果,格式化成2位十六禁止位的字符串
/// https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.md5?view=netframework-4.8
/// ComputeHash類的方法將 MD5 哈希值作為16字節(jié)的數(shù)組返回。 請注意,某些 MD5 實現(xiàn)產(chǎn)生了32字符的十六進制格式的哈希。
/// 若要與此類實現(xiàn)進行互操作,請將方法的返回值格式化 ComputeHash 為十六進制值。
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public static string GetHexStrByteArray(byte\[\] array)
{
string result = "";
for (int i = 0; i < array.Length; i++)
{
//輸出2位的十六進制
result+=($"{array\[i\]:x2}");
}
return result;
}
}
}
3.測試代碼項目說明
3.1 MD2Hash_C
環(huán)境:
IDE:CLion
構(gòu)建CMake(3.17)
編譯器MSVC14.27
目錄:
src? *#C源碼目錄?*
----md2.c? #md2算法實現(xiàn)
----mddriver.c? #測試代碼Main()在此文件在
include #頭文件目錄
----global.h #全局配置文件
----md2.h #md2.c頭文件
3.2 demo_py3
環(huán)境:
IDE:pycharm 或者visual studio 2019
構(gòu)建:IDE內(nèi)置
py3環(huán)境:vs2019自帶python環(huán)境 py3.7 x64
目錄:
main.py #測試源代碼
3.3 demo_Java
IDE:IDEA
構(gòu)建:IDE內(nèi)置
Java環(huán)境:java1.8
目錄:
lib 第三方庫目錄
----commons-codec-1.15.java? #引用的MD2加密算法庫
src 源代碼文件
----com.company.Main #測試源代碼
3.4 demo_c#
IDE:Rider 或者 visual studio 2019
構(gòu)建:IDE內(nèi)置
Dotnet環(huán)境:netcore3.1
目錄:
testdemo
----Program.cs #測試源代碼
參考引用
【4】參考網(wǎng)上的java MD2 demo Java MD2加密算法
【5】使用Mono加密庫官網(wǎng)介紹 Cryptography
【7】參考MSDN MD5官方文檔 MD5 類 代碼參考的 SHA256 類
總結(jié)
以上是生活随笔為你收集整理的java md2_GitHub - edzjx/Md2Crypto的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas 对某一行标准化_Pytho
- 下一篇: c++实现卷积码编码和维特比译码_鑫艾勒