【加班不再有】MD4

admin 2022年12月17日00:59:45评论34 views字数 9085阅读30分17秒阅读模式

【加班不再有】MD4

📌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(countInt(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_demoTestsXCTestCase {
    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

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年12月17日00:59:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【加班不再有】MD4https://cn-sec.com/archives/1469734.html

发表评论

匿名网友 填写信息