日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java md2_GitHub - edzjx/Md2Crypto

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java md2_GitHub - edzjx/Md2Crypto 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此項目來源一個字謎解體過程

一個程序猿在自己的微信公眾號里出了一個字謎。其中用到了MD2加密算法,這是各很古老的加密算法。從網上搜到作者92年發布的C代碼還能正常執行。此項目介紹解題過程,和使用C,C#,Java,Python3來測試代碼。

文章結構

破題

解體代碼

項目代碼說明

參考引用

題目:黑白皆算,對我等眾猿而言中央C所在位置數優剃愛膚杠吧愛慕帝貳億次的值是?

解:

1.破題

1.1黑白皆算,中央C所在位置(C do)

上圖是一個標準的鋼琴鍵盤示意圖。這句話的意思黑鍵也算,從第一個數中央C是第40個(每組12按鍵(7個白鍵+5個黑鍵,第一組前有3個按鍵)。

1.2 對我等眾猿而言

意思是從0開始索引,那么C do的位置值是39

1.3優剃愛膚杠吧 愛慕帝貳 貳億次 的值

這句話是諧音,實際指的的是 UTF-8 MD2 2億次的值。MD2是歷史悠久一個Hash加密算法,最初用于8位機這種嵌入式設備上,目前其安全性很低,不建議使用了。建議參考MD2算法作者原文上的測試結果,來驗證自己語言的加密算法。(網上搜到其作者92年寫的算法原文上面的C代碼我直接拷貝到clan中也照樣執行),Hash值這類算法一般輸入是一個字節數組。所以UTF-8的意思,以UTF-8編碼格式獲取39的字節編碼。2億次的意思就說循環加密2億次。實際上UTF-8對于此題沒有意義,對于0x00-0x7F之間的字符(包含數字字母),UTF-8編碼與ASCII編碼完全相同。

破題后就是寫代碼來計算了。

2.解題代碼

2.1Python

Python的代碼最為簡潔,我參考52pojie貼子:

from Crypto.Hash import MD2

if __name__ == '__main__':

#print_hi('PyCharm')

txt = "39"

# md2加密2億次 根據實際題目修改此處的

for i in range(200000000):

txt = MD2.new(txt.encode("utf8")).hexdigest()

print(txt)

需要Python環境安裝pycryptodome ,使用pip安裝 pip install pycryptodome。hexdigest()作為十六進制數據字符串值

2.2Java

需要導入apache.commons.codec庫。我建議建立Maven項目。這樣方便在線導入依賴。否則手工需要去官網下載jar包,再導入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 根據題目在是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#加密類調用步驟都多一些,而且沒有直接字符輸出的功能。我這對此封裝了方法,一個是進行字符串輸出,一個是封裝加密計算過程。使得最終調用的風格和上述兩個代碼類似。

新建項目后,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后是需要核實后位十六進制字節數組,為了方便查看結果,格式化成2位十六禁止位的字符串

/// https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography.md5?view=netframework-4.8

/// ComputeHash類的方法將 MD5 哈希值作為16字節的數組返回。 請注意,某些 MD5 實現產生了32字符的十六進制格式的哈希。

/// 若要與此類實現進行互操作,請將方法的返回值格式化 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

環境:

IDE:CLion

構建CMake(3.17)

編譯器MSVC14.27

目錄:

src? *#C源碼目錄?*

----md2.c? #md2算法實現

----mddriver.c? #測試代碼Main()在此文件在

include #頭文件目錄

----global.h #全局配置文件

----md2.h #md2.c頭文件

3.2 demo_py3

環境:

IDE:pycharm 或者visual studio 2019

構建:IDE內置

py3環境:vs2019自帶python環境 py3.7 x64

目錄:

main.py #測試源代碼

3.3 demo_Java

IDE:IDEA

構建:IDE內置

Java環境:java1.8

目錄:

lib 第三方庫目錄

----commons-codec-1.15.java? #引用的MD2加密算法庫

src 源代碼文件

----com.company.Main #測試源代碼

3.4 demo_c#

IDE:Rider 或者 visual studio 2019

構建:IDE內置

Dotnet環境:netcore3.1

目錄:

testdemo

----Program.cs #測試源代碼

參考引用

【4】參考網上的java MD2 demo Java MD2加密算法

【5】使用Mono加密庫官網介紹 Cryptography

【7】參考MSDN MD5官方文檔 MD5 類 代碼參考的 SHA256 類

總結

以上是生活随笔為你收集整理的java md2_GitHub - edzjx/Md2Crypto的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。