最初是下載了一個(gè)寫好了的Java版SHA1,代碼如下:
來源:http://blog.csdn.net/zyg158/archive/2007/06/26/1667531.aspx
在我們的一代令牌開發(fā)中,我們通過修改其部分源代碼(重寫sha1及相應(yīng)的操作),實(shí)現(xiàn)otp在Android平臺(tái)上的實(shí)現(xiàn)。其實(shí)我的工作量并不大,只是按要求把代碼改了改,寫一個(gè)SHA1類,加入了三個(gè)函數(shù),包含初始化,數(shù)據(jù)更新,更新輸出。以修改源代碼中的過耦合現(xiàn)象,即digestInt數(shù)據(jù)不被隨便修改,將其初始化過程實(shí)現(xiàn)在初始化函數(shù)中。
代碼如下:
代碼如下:
來源:http://blog.csdn.net/zyg158/archive/2007/06/26/1667531.aspx
1
public class SHA1 {
2
private final int[] abcde = {
3
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
4
};
5
// 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
6
private int[] digestInt = new int[5];
7
// 計(jì)算過程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
8
private int[] tmpData = new int[80];
9
// 計(jì)算sha-1摘要
10
private int process_input_bytes(byte[] bytedata) {
11
// 初試化常量
12
System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
13
// 格式化輸入字節(jié)數(shù)組,補(bǔ)10及長度數(shù)據(jù)
14
byte[] newbyte = byteArrayFormatData(bytedata);
15
// 獲取數(shù)據(jù)摘要計(jì)算的數(shù)據(jù)單元個(gè)數(shù)
16
int MCount = newbyte.length / 64;
17
// 循環(huán)對(duì)每個(gè)數(shù)據(jù)單元進(jìn)行摘要計(jì)算
18
for (int pos = 0; pos < MCount; pos++) {
19
// 將每個(gè)單元的數(shù)據(jù)轉(zhuǎn)換成16個(gè)整型數(shù)據(jù),并保存到tmpData的前16個(gè)數(shù)組元素中
20
for (int j = 0; j < 16; j++) {
21
tmpData[j] = byteArrayToInt(newbyte, (pos * 64) + (j * 4));
22
}
23
// 摘要計(jì)算函數(shù)
24
encrypt();
25
}
26
return 20;
27
}
28
// 格式化輸入字節(jié)數(shù)組格式
29
private byte[] byteArrayFormatData(byte[] bytedata) {
30
// 補(bǔ)0數(shù)量
31
int zeros = 0;
32
// 補(bǔ)位后總位數(shù)
33
int size = 0;
34
// 原始數(shù)據(jù)長度
35
int n = bytedata.length;
36
// 模64后的剩余位數(shù)
37
int m = n % 64;
38
// 計(jì)算添加0的個(gè)數(shù)以及添加10后的總長度
39
if (m < 56) {
40
zeros = 55 - m;
41
size = n - m + 64;
42
} else if (m == 56) {
43
zeros = 63;
44
size = n + 8 + 64;
45
} else {
46
zeros = 63 - m + 56;
47
size = (n + 64) - m + 64;
48
}
49
// 補(bǔ)位后生成的新數(shù)組內(nèi)容
50
byte[] newbyte = new byte[size];
51
// 復(fù)制數(shù)組的前面部分
52
System.arraycopy(bytedata, 0, newbyte, 0, n);
53
// 獲得數(shù)組Append數(shù)據(jù)元素的位置
54
int l = n;
55
// 補(bǔ)1操作
56
newbyte[l++] = (byte) 0x80;
57
// 補(bǔ)0操作
58
for (int i = 0; i < zeros; i++) {
59
newbyte[l++] = (byte) 0x00;
60
}
61
// 計(jì)算數(shù)據(jù)長度,補(bǔ)數(shù)據(jù)長度位共8字節(jié),長整型
62
long N = (long) n * 8;
63
byte h8 = (byte) (N & 0xFF);
64
byte h7 = (byte) ((N >> 8) & 0xFF);
65
byte h6 = (byte) ((N >> 16) & 0xFF);
66
byte h5 = (byte) ((N >> 24) & 0xFF);
67
byte h4 = (byte) ((N >> 32) & 0xFF);
68
byte h3 = (byte) ((N >> 40) & 0xFF);
69
byte h2 = (byte) ((N >> 48) & 0xFF);
70
byte h1 = (byte) (N >> 56);
71
newbyte[l++] = h1;
72
newbyte[l++] = h2;
73
newbyte[l++] = h3;
74
newbyte[l++] = h4;
75
newbyte[l++] = h5;
76
newbyte[l++] = h6;
77
newbyte[l++] = h7;
78
newbyte[l++] = h8;
79
return newbyte;
80
}
81
private int f1(int x, int y, int z) {
82
return (x & y) | (~x & z);
83
}
84
private int f2(int x, int y, int z) {
85
return x ^ y ^ z;
86
}
87
private int f3(int x, int y, int z) {
88
return (x & y) | (x & z) | (y & z);
89
}
90
private int f4(int x, int y) {
91
return (x << y) | x >>> (32 - y);
92
}
93
// 單元摘要計(jì)算函數(shù)
94
private void encrypt() {
95
for (int i = 16; i <= 79; i++) {
96
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^
97
tmpData[i - 16], 1);
98
}
99
int[] tmpabcde = new int[5];
100
for (int i1 = 0; i1 < tmpabcde.length; i1++) {
101
tmpabcde[i1] = digestInt[i1];
102
}
103
for (int j = 0; j <= 19; j++) {
104
int tmp = f4(tmpabcde[0], 5) +
105
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
106
tmpData[j] + 0x5a827999;
107
tmpabcde[4] = tmpabcde[3];
108
tmpabcde[3] = tmpabcde[2];
109
tmpabcde[2] = f4(tmpabcde[1], 30);
110
tmpabcde[1] = tmpabcde[0];
111
tmpabcde[0] = tmp;
112
}
113
for (int k = 20; k <= 39; k++) {
114
int tmp = f4(tmpabcde[0], 5) +
115
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
116
tmpData[k] + 0x6ed9eba1;
117
tmpabcde[4] = tmpabcde[3];
118
tmpabcde[3] = tmpabcde[2];
119
tmpabcde[2] = f4(tmpabcde[1], 30);
120
tmpabcde[1] = tmpabcde[0];
121
tmpabcde[0] = tmp;
122
}
123
for (int l = 40; l <= 59; l++) {
124
int tmp = f4(tmpabcde[0], 5) +
125
f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
126
tmpData[l] + 0x8f1bbcdc;
127
tmpabcde[4] = tmpabcde[3];
128
tmpabcde[3] = tmpabcde[2];
129
tmpabcde[2] = f4(tmpabcde[1], 30);
130
tmpabcde[1] = tmpabcde[0];
131
tmpabcde[0] = tmp;
132
}
133
for (int m = 60; m <= 79; m++) {
134
int tmp = f4(tmpabcde[0], 5) +
135
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
136
tmpData[m] + 0xca62c1d6;
137
tmpabcde[4] = tmpabcde[3];
138
tmpabcde[3] = tmpabcde[2];
139
tmpabcde[2] = f4(tmpabcde[1], 30);
140
tmpabcde[1] = tmpabcde[0];
141
tmpabcde[0] = tmp;
142
}
143
for (int i2 = 0; i2 < tmpabcde.length; i2++) {
144
digestInt[i2] = digestInt[i2] + tmpabcde[i2];
145
}
146
for (int n = 0; n < tmpData.length; n++) {
147
tmpData[n] = 0;
148
}
149
}
150
// 4字節(jié)數(shù)組轉(zhuǎn)換為整數(shù)
151
private int byteArrayToInt(byte[] bytedata, int i) {
152
return ((bytedata[i] & 0xff) << 24) | ((bytedata[i + 1] & 0xff) << 16) |
153
((bytedata[i + 2] & 0xff) << 8) | (bytedata[i + 3] & 0xff);
154
}
155
// 整數(shù)轉(zhuǎn)換為4字節(jié)數(shù)組
156
private void intToByteArray(int intValue, byte[] byteData, int i) {
157
byteData[i] = (byte) (intValue >>> 24);
158
byteData[i + 1] = (byte) (intValue >>> 16);
159
byteData[i + 2] = (byte) (intValue >>> 8);
160
byteData[i + 3] = (byte) intValue;
161
}
162
// 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串
163
private static String byteToHexString(byte ib) {
164
char[] Digit = {
165
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C',
166
'D', 'E', 'F'
167
};
168
char[] ob = new char[2];
169
ob[0] = Digit[(ib >>> 4) & 0X0F];
170
ob[1] = Digit[ib & 0X0F];
171
String s = new String(ob);
172
return s;
173
}
174
// 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串
175
private static String byteArrayToHexString(byte[] bytearray) {
176
String strDigest = "";
177
for (int i = 0; i < bytearray.length; i++) {
178
strDigest += byteToHexString(bytearray[i]);
179
}
180
return strDigest;
181
}
182
// 計(jì)算sha-1摘要,返回相應(yīng)的字節(jié)數(shù)組
183
public byte[] getDigestOfBytes(byte[] byteData) {
184
process_input_bytes(byteData);
185
byte[] digest = new byte[20];
186
for (int i = 0; i < digestInt.length; i++) {
187
intToByteArray(digestInt[i], digest, i * 4);
188
}
189
return digest;
190
}
191
// 計(jì)算sha-1摘要,返回相應(yīng)的十六進(jìn)制字符串
192
public String getDigestOfString(byte[] byteData) {
193
return byteArrayToHexString(getDigestOfBytes(byteData));
194
}
195
public static void main(String[] args) {
196
String data = "1";
197
System.out.println(data);
198
String digest = new SHA1().getDigestOfString(data.getBytes());
199
System.out.println(digest);
200
}
201
}
202

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

在我們的一代令牌開發(fā)中,我們通過修改其部分源代碼(重寫sha1及相應(yīng)的操作),實(shí)現(xiàn)otp在Android平臺(tái)上的實(shí)現(xiàn)。其實(shí)我的工作量并不大,只是按要求把代碼改了改,寫一個(gè)SHA1類,加入了三個(gè)函數(shù),包含初始化,數(shù)據(jù)更新,更新輸出。以修改源代碼中的過耦合現(xiàn)象,即digestInt數(shù)據(jù)不被隨便修改,將其初始化過程實(shí)現(xiàn)在初始化函數(shù)中。
代碼如下:
/**
* SHA1類,主要包含encrypt,init,upData,doFinal函數(shù)
* @author Snowolf
*
*/public class SHA1{
private final int[] abcde = {
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
};
// 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
private int[] digestInt = new int[5];
// 計(jì)算過程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
private int[] tmpData = new int[80];
/**
* f1是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
* @param x 32位字
* @param y 32位字
* @param z 32位字
* @return 運(yùn)算結(jié)果
*/
private int f1(int x, int y, int z) {
return (x & y) | (~x & z);
}
/**
* f2是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
* @param x 32位字
* @param y 32位字
* @param z 32位字
* @return 運(yùn)算結(jié)果
*/
private int f2(int x, int y, int z) {
return x ^ y ^ z;
}
/**
* f3是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
* @param x 32位字
* @param y 32位字
* @param z 32位字
* @return 運(yùn)算結(jié)果
*/
private int f3(int x, int y, int z) {
return (x & y) | (x & z) | (y & z);
}
/**
* f4是循環(huán)移位函數(shù),將x進(jìn)行循環(huán)移位,移位次數(shù)為y
* @param x 要移位的字
* @param y 移位次數(shù)
* @return 運(yùn)算結(jié)果
*/
private int f4(int x, int y) {
return (x << y) | x >>> (32 - y);
}
/**
* 單元摘要計(jì)算函數(shù),函數(shù)運(yùn)算完成后,最終結(jié)果儲(chǔ)存在digestInt中
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
* @return void
* @author Snowolf
*/
private void encrypt(int[] Message_Block) {
for(int t = 0; t < 16; t++)
{
tmpData[t] = Message_Block[t];
}
for (int i = 16; i <= 79; i++) {
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^
tmpData[i - 16], 1);
}
int[] tmpabcde = new int[5];
for (int i1 = 0; i1 < tmpabcde.length; i1++) {
tmpabcde[i1] = digestInt[i1];
}
for (int j = 0; j <= 19; j++) {
int tmp = f4(tmpabcde[0], 5) +
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[j] + 0x5a827999;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int k = 20; k <= 39; k++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[k] + 0x6ed9eba1;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int l = 40; l <= 59; l++) {
int tmp = f4(tmpabcde[0], 5) +
f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[l] + 0x8f1bbcdc;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int m = 60; m <= 79; m++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[m] + 0xca62c1d6;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int i2 = 0; i2 < tmpabcde.length; i2++) {
digestInt[i2] = digestInt[i2] + tmpabcde[i2];//摘要存儲(chǔ)在digestInt
}
for (int n = 0; n < tmpData.length; n++) {
tmpData[n] = 0;
}
}
/**
* 初始化函數(shù),將digestInt值初始化為SHA1算法中的原始初值
*/
public void init(){
System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
}
/** SHA1加密運(yùn)算,其中updata返回值為void,此時(shí)digestInt中的數(shù)據(jù)為計(jì)算結(jié)果(摘要)
*為16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的數(shù)據(jù)
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
* @author Snowolf
*/
public void upData(int[] Message_Block){
encrypt(Message_Block);
}
/**
* SHA1加密運(yùn)算,返回值為int[],即返回計(jì)算出來的摘要
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
* @return int[5]摘要
* @author Snowolf
*/
public int[] doFinal(int[] Message_Block){
int[] doFinalInt = new int[5];
encrypt(Message_Block);
System.arraycopy(digestInt, 0, doFinalInt, 0, digestInt.length);
return doFinalInt;
}
}
* SHA1類,主要包含encrypt,init,upData,doFinal函數(shù)
* @author Snowolf
*
*/public class SHA1{
private final int[] abcde = {
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
};
// 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
private int[] digestInt = new int[5];
// 計(jì)算過程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
private int[] tmpData = new int[80];
/**
* f1是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
* @param x 32位字
* @param y 32位字
* @param z 32位字
* @return 運(yùn)算結(jié)果
*/
private int f1(int x, int y, int z) {
return (x & y) | (~x & z);
}
/**
* f2是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
* @param x 32位字
* @param y 32位字
* @param z 32位字
* @return 運(yùn)算結(jié)果
*/
private int f2(int x, int y, int z) {
return x ^ y ^ z;
}
/**
* f3是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
* @param x 32位字
* @param y 32位字
* @param z 32位字
* @return 運(yùn)算結(jié)果
*/
private int f3(int x, int y, int z) {
return (x & y) | (x & z) | (y & z);
}
/**
* f4是循環(huán)移位函數(shù),將x進(jìn)行循環(huán)移位,移位次數(shù)為y
* @param x 要移位的字
* @param y 移位次數(shù)
* @return 運(yùn)算結(jié)果
*/
private int f4(int x, int y) {
return (x << y) | x >>> (32 - y);
}
/**
* 單元摘要計(jì)算函數(shù),函數(shù)運(yùn)算完成后,最終結(jié)果儲(chǔ)存在digestInt中
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
* @return void
* @author Snowolf
*/
private void encrypt(int[] Message_Block) {
for(int t = 0; t < 16; t++)
{
tmpData[t] = Message_Block[t];
}
for (int i = 16; i <= 79; i++) {
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^
tmpData[i - 16], 1);
}
int[] tmpabcde = new int[5];
for (int i1 = 0; i1 < tmpabcde.length; i1++) {
tmpabcde[i1] = digestInt[i1];
}
for (int j = 0; j <= 19; j++) {
int tmp = f4(tmpabcde[0], 5) +
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[j] + 0x5a827999;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int k = 20; k <= 39; k++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[k] + 0x6ed9eba1;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int l = 40; l <= 59; l++) {
int tmp = f4(tmpabcde[0], 5) +
f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[l] + 0x8f1bbcdc;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int m = 60; m <= 79; m++) {
int tmp = f4(tmpabcde[0], 5) +
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
tmpData[m] + 0xca62c1d6;
tmpabcde[4] = tmpabcde[3];
tmpabcde[3] = tmpabcde[2];
tmpabcde[2] = f4(tmpabcde[1], 30);
tmpabcde[1] = tmpabcde[0];
tmpabcde[0] = tmp;
}
for (int i2 = 0; i2 < tmpabcde.length; i2++) {
digestInt[i2] = digestInt[i2] + tmpabcde[i2];//摘要存儲(chǔ)在digestInt
}
for (int n = 0; n < tmpData.length; n++) {
tmpData[n] = 0;
}
}
/**
* 初始化函數(shù),將digestInt值初始化為SHA1算法中的原始初值
*/
public void init(){
System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
}
/** SHA1加密運(yùn)算,其中updata返回值為void,此時(shí)digestInt中的數(shù)據(jù)為計(jì)算結(jié)果(摘要)
*為16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的數(shù)據(jù)
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
* @author Snowolf
*/
public void upData(int[] Message_Block){
encrypt(Message_Block);
}
/**
* SHA1加密運(yùn)算,返回值為int[],即返回計(jì)算出來的摘要
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
* @return int[5]摘要
* @author Snowolf
*/
public int[] doFinal(int[] Message_Block){
int[] doFinalInt = new int[5];
encrypt(Message_Block);
System.arraycopy(digestInt, 0, doFinalInt, 0, digestInt.length);
return doFinalInt;
}
}
代碼如下:
1
/**
2
* SHA1類,主要包含encrypt,init,upData,doFinal函數(shù)
3
* @author Snowolf
4
*
5
*/
6
public class SHA1{
7
private final int[] abcde = {
8
0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
9
};
10
// 摘要數(shù)據(jù)存儲(chǔ)數(shù)組
11
private int[] digestInt = new int[5];
12
// 計(jì)算過程中的臨時(shí)數(shù)據(jù)存儲(chǔ)數(shù)組
13
14
private int[] tmpData = new int[80];
15
/**
16
* f1是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
17
* @param x 32位字
18
* @param y 32位字
19
* @param z 32位字
20
* @return 運(yùn)算結(jié)果
21
*/
22
private int f1(int x, int y, int z) {
23
return (x & y) | (~x & z);
24
}
25
/**
26
* f2是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
27
* @param x 32位字
28
* @param y 32位字
29
* @param z 32位字
30
* @return 運(yùn)算結(jié)果
31
*/
32
private int f2(int x, int y, int z) {
33
return x ^ y ^ z;
34
}
35
/**
36
* f3是SHA1算法中的一系列函數(shù)中的一個(gè),操作32位字x,y,z并且產(chǎn)生32位字作為輸出
37
* @param x 32位字
38
* @param y 32位字
39
* @param z 32位字
40
* @return 運(yùn)算結(jié)果
41
*/
42
private int f3(int x, int y, int z) {
43
return (x & y) | (x & z) | (y & z);
44
}
45
/**
46
* f4是循環(huán)移位函數(shù),將x進(jìn)行循環(huán)移位,移位次數(shù)為y
47
* @param x 要移位的字
48
* @param y 移位次數(shù)
49
* @return 運(yùn)算結(jié)果
50
*/
51
private int f4(int x, int y) {
52
return (x << y) | x >>> (32 - y);
53
}
54
/**
55
* 單元摘要計(jì)算函數(shù),函數(shù)運(yùn)算完成后,最終結(jié)果儲(chǔ)存在digestInt中
56
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
57
* @return void
58
* @author Snowolf
59
*/
60
private void encrypt(int[] Message_Block) {
61
for(int t = 0; t < 16; t++)
62
{
63
tmpData[t] = Message_Block[t];
64
}
65
for (int i = 16; i <= 79; i++) {
66
tmpData[i] = f4(tmpData[i - 3] ^ tmpData[i - 8] ^ tmpData[i - 14] ^
67
tmpData[i - 16], 1);
68
}
69
int[] tmpabcde = new int[5];
70
for (int i1 = 0; i1 < tmpabcde.length; i1++) {
71
tmpabcde[i1] = digestInt[i1];
72
}
73
for (int j = 0; j <= 19; j++) {
74
int tmp = f4(tmpabcde[0], 5) +
75
f1(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
76
tmpData[j] + 0x5a827999;
77
tmpabcde[4] = tmpabcde[3];
78
tmpabcde[3] = tmpabcde[2];
79
tmpabcde[2] = f4(tmpabcde[1], 30);
80
tmpabcde[1] = tmpabcde[0];
81
tmpabcde[0] = tmp;
82
}
83
for (int k = 20; k <= 39; k++) {
84
int tmp = f4(tmpabcde[0], 5) +
85
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
86
tmpData[k] + 0x6ed9eba1;
87
tmpabcde[4] = tmpabcde[3];
88
tmpabcde[3] = tmpabcde[2];
89
tmpabcde[2] = f4(tmpabcde[1], 30);
90
tmpabcde[1] = tmpabcde[0];
91
tmpabcde[0] = tmp;
92
}
93
for (int l = 40; l <= 59; l++) {
94
int tmp = f4(tmpabcde[0], 5) +
95
f3(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
96
tmpData[l] + 0x8f1bbcdc;
97
tmpabcde[4] = tmpabcde[3];
98
tmpabcde[3] = tmpabcde[2];
99
tmpabcde[2] = f4(tmpabcde[1], 30);
100
tmpabcde[1] = tmpabcde[0];
101
tmpabcde[0] = tmp;
102
}
103
for (int m = 60; m <= 79; m++) {
104
int tmp = f4(tmpabcde[0], 5) +
105
f2(tmpabcde[1], tmpabcde[2], tmpabcde[3]) + tmpabcde[4] +
106
tmpData[m] + 0xca62c1d6;
107
tmpabcde[4] = tmpabcde[3];
108
tmpabcde[3] = tmpabcde[2];
109
tmpabcde[2] = f4(tmpabcde[1], 30);
110
tmpabcde[1] = tmpabcde[0];
111
tmpabcde[0] = tmp;
112
}
113
for (int i2 = 0; i2 < tmpabcde.length; i2++) {
114
digestInt[i2] = digestInt[i2] + tmpabcde[i2];//摘要存儲(chǔ)在digestInt
115
}
116
for (int n = 0; n < tmpData.length; n++) {
117
tmpData[n] = 0;
118
}
119
}
120
/**
121
* 初始化函數(shù),將digestInt值初始化為SHA1算法中的原始初值
122
*/
123
public void init(){
124
System.arraycopy(abcde, 0, digestInt, 0, abcde.length);
125
}
126
/** SHA1加密運(yùn)算,其中updata返回值為void,此時(shí)digestInt中的數(shù)據(jù)為計(jì)算結(jié)果(摘要)
127
*為16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的數(shù)據(jù)
128
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
129
* @author Snowolf
130
*/
131
public void upData(int[] Message_Block){
132
encrypt(Message_Block);
133
}
134
/**
135
* SHA1加密運(yùn)算,返回值為int[],即返回計(jì)算出來的摘要
136
* @param Message_Block 為大小16個(gè)字的int型數(shù)組,即我們已經(jīng)格式化完成的,要進(jìn)行加密運(yùn)算的數(shù)據(jù)
137
* @return int[5]摘要
138
* @author Snowolf
139
*/
140
public int[] doFinal(int[] Message_Block){
141
int[] doFinalInt = new int[5];
142
encrypt(Message_Block);
143
System.arraycopy(digestInt, 0, doFinalInt, 0, digestInt.length);
144
return doFinalInt;
145
}
146
}
147

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147
