summaryrefslogtreecommitdiffstats
path: root/md5bash.sh
diff options
context:
space:
mode:
Diffstat (limited to 'md5bash.sh')
-rw-r--r--md5bash.sh79
1 files changed, 79 insertions, 0 deletions
diff --git a/md5bash.sh b/md5bash.sh
new file mode 100644
index 0000000..9a2ed8f
--- /dev/null
+++ b/md5bash.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+# read in the input string from command line arguments
+input=$1
+
+# pad the input string with a single "1" bit
+padded_input="$input"$(echo -ne '\x80')
+
+# pad the input string to a multiple of 512 bits (64 bytes)
+while (( $(echo -n "$padded_input" | wc -c) % 64 != 56 ))
+do
+ padded_input="$padded_input"$(echo -ne '\x00')
+done
+
+# append the length of the input string (in bits) as a 64-bit little-endian integer
+length=$(echo -n "$input" | wc -c)
+length=$(echo "obase=16; $length * 8" | bc | xxd -p -c 16 | tac | tr -d '\n')
+while (( $(echo -n "$length" | wc -c) < 16 ))
+do
+ length="$length"0
+done
+padded_input="$padded_input"$(echo -ne "$length" | xxd -r -p)
+
+# initialize the buffer (A, B, C, D)
+A="67452301"
+B="efcdab89"
+C="98badcfe"
+D="10325476"
+
+# process the input in 512-bit (64-byte) chunks
+for (( i=0; i<$(echo -n "$padded_input" | wc -c)/64; i++ ))
+do
+ chunk=$(echo -n "$padded_input" | dd bs=64 skip=$i count=1 2>/dev/null | xxd -p -c 64)
+
+ # initialize the message schedule (M)
+ M=()
+ for (( j=0; j<16; j++ ))
+ do
+ word=$(echo -ne "${chunk:$j*8:8}" | xxd -r -p | od -An -tu4 -v)
+ M+=($word)
+ done
+ for (( j=16; j<64; j++ ))
+ do
+ word1=${M[j-15]}
+ s0=$(( (word1>>7 | word1<<25) ^ (word1>>18 | word1<<14) ^ (word1>>3) ))
+
+ word2=${M[j-2]}
+ s1=$(( (word2>>17 | word2<<15) ^ (word2>>19 | word2<<13) ^ (word2>>10) ))
+
+ M+=($((M[j-16] + s0 + M[j-7] + s1)))
+ done
+
+ # initialize the working variables
+ AA=$A
+ BB=$B
+ CC=$C
+ DD=$D
+
+ # round 1
+ for (( j=0; j<16; j++ ))
+ do
+ F=$(( (B & C) | (~B & D) ))
+ g=$j
+ dTemp=$((D))
+ D=$((C))
+ C=$((B))
+ B=$((B + ((A + F + M[g] + 0xd76aa478) & 0xffffffff)))
+ A=$((dTemp))
+ done
+
+ # round 2
+ for (( j=16; j<32; j++ ))
+ do
+ F=$(( (D & B) | (~D & C) ))
+ g=$(( (5*j + 1) % 16 ))
+ dTemp=$((D))
+ D=$((C))
+ C=$((B))
+