【加班不再有】MD4
❝
📌MD4已不再安全,涉及到有安全需求的业务,请慎重考虑使用MD4 !!!!
❞
❝
📌这里给出常见语言的「MD4」调用方案,目前已按照语言的「字母序」(正序)进行排列,方便读者查找。
❞
Bash
依赖库
-
openssl
代码
#!/bin/bash
echo -n "" | openssl dgst -md4
echo -n "Hello, world!" | openssl dgst -md4
echo -n "The quick brown fox jumps over the lazy dog." | openssl dgst -md4
C
依赖库
-
boringssl
代码
#include <cstdio>
#include <cstring>
#include "openssl/md4.h"
static void md4(const char *message, char *output) {
unsigned char digest[MD4_DIGEST_LENGTH];
MD4_CTX ctx;
MD4_Init(&ctx);
MD4_Update(&ctx, message, strlen(message));
MD4_Final(digest, &ctx);
for (int i = 0; i < MD4_DIGEST_LENGTH; i++) {
sprintf(output + (i * 2), "%02x", (unsigned int)digest[i]);
}
}
使用样例
int main(int argc, char **argv) {
char md4_output[MD4_DIGEST_LENGTH];
md4("", md4_output);
printf("%sn", md4_output);
md4("Hello, world!", md4_output);
printf("%sn", md4_output);
md4("The quick brown fox jumps over the lazy dog.", md4_output);
printf("%sn", md4_output);
return 0;
}
C++
依赖库
-
botan
代码
#include <iostream>
#include "../lib/hash/hash.h"
#include "../lib/base/symkey.h"
std::string md4(const std::string &message) {
auto hash = Botan::HashFunction::create("MD4");
auto result = hash->process(message);
return Botan::OctetString(result).to_string();
}
使用样例
int main(int argc, char *argv[]) {
std::cout << md4("") << std::endl;
std::cout << md4("Hello, world!") << std::endl;
std::cout << md4("The quick brown fox jumps over the lazy dog.") << std::endl;
return 0;
}
C#
依赖库
-
dotnet add package BouncyCastle --version 1.8.9
代码
using System.Text;
using Org.BouncyCastle.Crypto.Digests;
string Md4(string message)
{
var hashAlgorithm = new MD4Digest();
byte[] input = Encoding.UTF8.GetBytes(message);
hashAlgorithm.BlockUpdate(input, 0, input.Length);
byte[] bytes = new byte[16];
hashAlgorithm.DoFinal(bytes, 0);
StringBuilder stringBuilder = new StringBuilder();
foreach (byte b in bytes)
{
stringBuilder.Append(b.ToString("x2"));
}
return stringBuilder.ToString();
}
使用样例
Console.WriteLine(Md4(""));
Console.WriteLine(Md4("Hello, World!"));
Console.WriteLine(Md4("The quick brown fox jumps over the lazy dog."));
Dart
依赖
dependencies:
# ...
pointycastle: ^3.6.2
# ...
代码
import 'dart:convert';
import 'dart:typed_data';
import 'package:pointycastle/api.dart';
// bytes to hex
String bytesToHex(List<int> bytes) {
return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
}
String md4(String message) {
var digest = Digest("MD4");
var bytes = digest.process(Uint8List.fromList(utf8.encode(message)));
return bytesToHex(bytes);
}
使用样例
void main(List<String> arguments) {
print(md4(""));
print(md4("Hello, world!"));
print(md4("The quick brown fox jumps over the lazy dog."));
}
Go
依赖库
require golang.org/x/crypto v0.3.0
代码
package main
import (
"encoding/hex"
"golang.org/x/crypto/md4"
)
func Md4(message string) string {
digest := md4.New()
bytes := digest.Sum([]byte(message))
return hex.EncodeToString(bytes[:])
}
使用样例
func main() {
println(Md4(""))
println(Md4("Hello World!"))
println(Md4("The quick brown fox jumps over the lazy dog."))
}
Java
❝
📌这里需要使用java1.8,高版本是没这个函数的
❞
代码
package com.littleq;
import sun.security.provider.MD4;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Main {
public static String byteArrayToHex(byte[] a) {
StringBuilder sb = new StringBuilder(a.length * 2);
for (byte b : a)
sb.append(String.format("%02x", b));
return sb.toString();
}
static String md4(String message) throws NoSuchAlgorithmException {
MessageDigest md = MD4.getInstance();
return byteArrayToHex(md.digest(message.getBytes()));
}
}
使用样例
package com.littleq;
import sun.security.provider.MD4;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Main {
public static void main(String[] args) throws NoSuchAlgorithmException {
System.out.println(md4(""));
System.out.println(md4("Hello, world!"));
System.out.println(md4("The quick brown fox jumps over the lazy dog."));
}
}
JavaScript
❝
📌目前node19应该是移除了该算法的,目前使用node14.15.1可以正常运行
❞
代码
const crypto = require('crypto');
function md4(message) {
return crypto.createHash('md4').update(message).digest('hex');
}
使用样例
function main() {
console.log(md4(''));
console.log(md4('Hello, World!'));
console.log(md4('The quick brown fox jumps over the lazy dog.'));
}
main();
Kotlin
❝
📌这里需要使用java1.8,高版本是没这个函数的
❞
代码
import sun.security.provider.MD4
fun md4(message: String): String {
val md = MD4.getInstance()
val digest = md.digest(message.toByteArray())
return digest.fold("") { str, it -> str + "%02x".format(it) }
}
使用样例
fun main(args: Array<String>) {
println(md4(""))
println(md4("Hello, world!"))
println(md4("The quick brown fox jumps over the lazy dog."))
}
Objective-C
代码
#import <CommonCrypto/CommonDigest.h>
NSString *md4(NSString *message) {
unsigned char result[CC_MD4_DIGEST_LENGTH];
CC_MD4([message UTF8String], (CC_LONG) [message lengthOfBytesUsingEncoding:NSUTF8StringEncoding], result);
NSMutableString *hash = [NSMutableString string];
for (int i = 0; i < CC_MD4_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02X", result[i]];
}
return [hash lowercaseString];
}
使用样例
- (void)testExample {
NSLog(@"%s", md4(@"").UTF8String);
NSLog(@"%s", md4(@"Hello World!").UTF8String);
NSLog(@"%s", md4(@"The quick brown fox jumps over the lazy dog").UTF8String);
}
PHP
代码
<?php
function md4($message): string
{
return hash('md4', $message);
}
使用样例
<?php
echo md4(''), PHP_EOL;
echo md4('Hello, world!'), PHP_EOL;
echo md4("The quick brown fox jumps over the lazy dog."), PHP_EOL;
Python
代码
import hashlib
def md4(message: str) -> str:
return hashlib.new("md4", message.encode()).hexdigest()
使用案例
if __name__ == '__main__':
print(md4(''))
print(md4('hello world'))
print(md4('The quick brown fox jumps over the lazy dog'))
R
依赖库
-
openssl 2.0.4
代码
library(openssl)
md4 <- function(message) {
openssl::md4(message)
}
使用案例
print(md4(""))
print(md4("Hello, world!"))
print(md4("The quick brown fox jumps over the lazy dog."))
Ruby
依赖库
-
gem install openssl 3.0.1
代码
require 'openssl'
class Cryptography::DemoTest < Minitest::Test
def md4(message)
OpenSSL::Digest::MD4.hexdigest(message)
end
end
使用样例
class Cryptography::DemoTest < Minitest::Test
def test_it_does_something_useful
print(md4("") + "n")
print(md4("Hello, world!") + "n")
print(md4("The quick brown fox jumps over the lazy dog.") + "n")
end
end
Rust
依赖库
[dependencies]
md4 = "0.10.2"
代码
use md4::{Md4, Digest};
fn md4(message: String) -> String {
let mut hasher = Md4::new();
hasher.update(message.as_bytes());
let result = hasher.finalize();
return format!("{:x}", result);
}
使用案例
fn main() {
println!("{}", md4("".to_string()));
println!("{}", md4("Hello, world!".to_string()));
println!("{}", md4("The quick brown fox jumps over the lazy dog.".to_string()));
}
Swift
代码
import Foundation
import var CommonCrypto.CC_MD4_DIGEST_LENGTH
import func CommonCrypto.CC_MD4
import typealias CommonCrypto.CC_LONG
func MD4(message: String) -> String {
let messageData = message.data(using: .utf8)!
var digestData = Data(count: Int(CC_MD4_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
messageData.withUnsafeBytes { messageBytes -> UInt8 in
if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
let messageLength = CC_LONG(messageData.count)
CC_MD4(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
}
return 0
}
}
return digestData.map {
String(format: "%02hhx", $0)
}
.joined()
}
使用样例
import XCTest
final class cryptography_demoTests: XCTestCase {
func testExample() throws {
print(MD4(message: ""))
print(MD4(message: "Hello, World!"))
print(MD4(message: "The quick brown fox jumps over the lazy dog"))
}
}
VB DotNet
依赖库
dotnet add package BouncyCastle --version 1.8.9
代码
Imports System.Text
Imports Org.BouncyCastle.Crypto.Digests
Public Class Application
Private Shared Function Md4Hash(message As String) As String
Dim algo As New MD4Digest()
Dim messageBytes As Byte() = Encoding.UTF8.GetBytes(message)
algo.BlockUpdate(messageBytes, 0, messageBytes.Length)
Dim bytes As Byte() = New Byte(algo.GetDigestSize() - 1) {}
algo.DoFinal(bytes, 0)
Dim sBuilder As New StringBuilder()
For n As Integer = 0 To bytes.Length - 1
sBuilder.Append(bytes(n).ToString("x2"))
Next n
Return sBuilder.ToString()
End Function
End Class
使用样例
Imports System.Text
Imports Org.BouncyCastle.Crypto.Digests
Public Class Application
Public Shared Sub Main()
System.Console.WriteLine(Md4Hash(""))
System.Console.WriteLine(Md4Hash("Hello, world!"))
System.Console.WriteLine(Md4Hash("The quick brown fox jumps over the lazy dog."))
End Sub
End Class
说明
❝
📌目前优先采用语言内部实现,引入的外部依赖会给出并指定版本,如果我对某些源码产生的修改,会优先遵从原始库的写法风格,并且会给出,由于个人水平有限,大家在使用我修改后或者实现的方案的时候,用于生产用途,建议自行研判一下安全性,建议大家使用标准实现,采用官方推荐或者使用人数较多的库用于生产环境,以保证安全性,因为个人水平有限,因此有些库可能用的不合适,如果读者觉得不合适,欢迎指出,如果读者有推荐使用的库,欢迎和我交流,注意,交流的时候建议提供完整的语言版本,库版本,以及使用方法和样例,最好是带文档,并且开源的库,并前期自行验证下实现是不是正确的,因为有些实现出来的算法用的标准不一样,可能会存在差异,如果有差异,最好可以提供对应的rfc或者paper,在这里先感谢各位读者大佬们了,最终愿大家加班不再有。
❞
原文始发于微信公众号(Coder小Q):【加班不再有】MD4
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论