?? 11.htm
字號:
style="WORD-BREAK: break-all">
<TABLE id=SHA-1摘要算法源碼(java版) align=left
border=0><TBODY>
<TR>
<TD>
<DIV class=guanggao id=SHA-1摘要算法源碼(java版)><SPAN
id=ad3></SPAN></DIV>
<DIV class=guanggao id=SHA-1摘要算法源碼(java版)><SPAN
id=contentAdv></SPAN></DIV></TD></TR></TBODY></TABLE>
<DIV id=VbellShow>public class SHA1
{<BR> private final int[] abcde
=
{<BR>
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476,
0xc3d2e1f0<BR>
};
<P> //
摘要數據存儲數組<BR> private int[]
digestInt = new int[5];</P>
<P> //
計算過程中的臨時數據存儲數組<BR> private int[]
tmpData = new int[80];</P>
<P> //
計算sha-1摘要<BR> private int
process_input_bytes(byte[] bytedata)
{<BR> //
初試化常量<BR>
System.arraycopy(abcde, 0, digestInt, 0,
abcde.length);</P>
<P> //
格式化輸入字節數組,補10及長度數據<BR>
byte[] newbyte =
byteArrayFormatData(bytedata);</P>
<P> //
獲取數據摘要計算的數據單元個數<BR>
int MCount = newbyte.length / 64;</P>
<P> //
循環對每個數據單元進行摘要計算<BR>
for (int pos = 0; pos < MCount; pos++)
{<BR>
//
將每個單元的數據轉換成16個整型數據,并保存到tmpData的前16個數組元素中<BR>
for (int j = 0; j < 16; j++)
{<BR>
tmpData[j] = byteArrayToInt(newbyte, (pos * 64) +
(j *
4));<BR>
}</P>
<P>
//
摘要計算函數<BR>
encrypt();<BR>
}</P>
<P>
return 20;<BR> }</P>
<P> //
格式化輸入字節數組格式<BR> private byte[]
byteArrayFormatData(byte[] bytedata)
{<BR> //
補0數量<BR>
int zeros = 0;</P>
<P> //
補位后總位數<BR>
int size = 0;</P>
<P> //
原始數據長度<BR>
int n = bytedata.length;</P>
<P> //
模64后的剩余位數<BR>
int m = n % 64;</P>
<P> //
計算添加0的個數以及添加10后的總長度<BR>
if (m < 56)
{<BR>
zeros = 55 -
m;<BR>
size = n - m +
64;<BR>
} else if (m == 56)
{<BR>
zeros =
63;<BR>
size = n + 8 +
64;<BR>
} else
{<BR>
zeros = 63 - m +
56;<BR>
size = (n + 64) - m +
64;<BR>
}</P>
<P> //
補位后生成的新數組內容<BR>
byte[] newbyte = new
byte[size];<BR>
//
復制數組的前面部分<BR>
System.arraycopy(bytedata, 0, newbyte, 0, n);</P>
<P> //
獲得數組Append數據元素的位置<BR>
int l =
n;<BR>
//
補1操作<BR>
newbyte[l++] = (byte) 0x80;</P>
<P> //
補0操作<BR>
for (int i = 0; i < zeros; i++)
{<BR>
newbyte[l++] = (byte)
0x00;<BR>
}</P>
<P> //
計算數據長度,補數據長度位共8字節,長整型<BR>
long N = (long) n *
8;<BR>
byte h8 = (byte) (N &
0xFF);<BR>
byte h7 = (byte) ((N >> 8) &
0xFF);<BR>
byte h6 = (byte) ((N >> 16) &
0xFF);<BR>
byte h5 = (byte) ((N >> 24) &
0xFF);<BR>
byte h4 = (byte) ((N >> 32) &
0xFF);<BR>
byte h3 = (byte) ((N >> 40) &
0xFF);<BR>
byte h2 = (byte) ((N >> 48) &
0xFF);<BR>
byte h1 = (byte) (N >>
56);<BR>
newbyte[l++] =
h1;<BR>
newbyte[l++] =
h2;<BR>
newbyte[l++] =
h3;<BR>
newbyte[l++] =
h4;<BR>
newbyte[l++] =
h5;<BR>
newbyte[l++] =
h6;<BR>
newbyte[l++] =
h7;<BR>
newbyte[l++] = h8;</P>
<P>
return newbyte;<BR> }</P>
<P> private int f1(int x, int y,
int z)
{<BR>
return (x & y) | (~x &
z);<BR> }</P>
<P> private int f2(int x, int y,
int z)
{<BR>
return x ^ y ^ z;<BR> }</P>
<P> private int f3(int x, int y,
int z)
{<BR>
return (x & y) | (x & z) | (y &
z);<BR> }</P>
<P> private int f4(int x, int y)
{<BR>
return (x << y) | x >>> (32 -
y);<BR> }</P>
<P> //
單元摘要計算函數<BR> private void
encrypt()
{<BR>
for (int i = 16; i <= 79; i++)
{<BR>
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^
tmpData[i - 14]
^<BR>
tmpData[i - 16],
1);<BR>
}</P>
<P>
int[] tmpabcde = new int[5];</P>
<P> for
(int i1 = 0; i1 < tmpabcde.length; i1++)
{<BR>
tmpabcde[i1] =
digestInt[i1];<BR>
}</P>
<P> for
(int j = 0; j <= 19; j++)
{<BR>
int tmp = f4(tmpabcde[0], 5)
+<BR>
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) +
tmpabcde[4]
+<BR>
tmpData[j] +
0x5a827999;<BR>
tmpabcde[4] =
tmpabcde[3];<BR>
tmpabcde[3] =
tmpabcde[2];<BR>
tmpabcde[2] = f4(tmpabcde[1],
30);<BR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -