每日一步Java加密技术三.docx

上传人:b****8 文档编号:10888886 上传时间:2023-02-23 格式:DOCX 页数:27 大小:23.40KB
下载 相关 举报
每日一步Java加密技术三.docx_第1页
第1页 / 共27页
每日一步Java加密技术三.docx_第2页
第2页 / 共27页
每日一步Java加密技术三.docx_第3页
第3页 / 共27页
每日一步Java加密技术三.docx_第4页
第4页 / 共27页
每日一步Java加密技术三.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

每日一步Java加密技术三.docx

《每日一步Java加密技术三.docx》由会员分享,可在线阅读,更多相关《每日一步Java加密技术三.docx(27页珍藏版)》请在冰豆网上搜索。

每日一步Java加密技术三.docx

每日一步Java加密技术三

接下来我们分析DH加密算法,一种适基于密钥一致协议的加密算法。

DH

Diffie-Hellman算法(D-H算法),密钥一致协议。

是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。

简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。

换句话说,就是由甲方产出一对密钥(公钥、私钥),乙方依照甲方公钥产生乙方密钥对(公钥、私钥)。

以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥(SecretKey)对数据加密。

这样,在互通了本地密钥(SecretKey)算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。

不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯!

该算法源于中国的同余定理——中国馀数定理。

流程分析:

1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留;双方约定数据加密算法;乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留。

2.甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给乙方加密后的数据;乙方使用私钥、甲方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。

3.乙方使用私钥、甲方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给甲方加密后的数据;甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。

通过java代码实现如下:

Java代码

1importjava.security.Key;

2importjava.security.KeyFactory;

3importjava.security.KeyPair;

4importjava.security.KeyPairGenerator;

5importjava.security.PublicKey;

6importjava.security.spec.PKCS8EncodedKeySpec;

7importjava.security.spec.X509EncodedKeySpec;

8importjava.util.HashMap;

9importjava.util.Map;

10

11importjavax.crypto.Cipher;

12importjavax.crypto.KeyAgreement;

13importjavax.crypto.SecretKey;

14importjavax.crypto.interfaces.DHPrivateKey;

15importjavax.crypto.interfaces.DHPublicKey;

16importjavax.crypto.spec.DHParameterSpec;

17

18/**

19*DH安全编码组件

20*

21*@author梁栋

22*@version1.0

23*@since1.0

24*/

25publicabstractclassDHCoderextendsCoder{

26publicstaticfinalStringALGORITHM="DH";

27

28/**

29*默认密钥字节数

30*

31*

32*DH

33*DefaultKeysize1024

34*Keysizemustbeamultipleof64,rangingfrom512to1024(inclusive).

35*

36*/

37privatestaticfinalintKEY_SIZE=1024;

38

39/**

40*DH加密下需要一种对称加密算法对数据加密,这里我们使用DES,也可以使用其他对称加密算法。

41*/

42publicstaticfinalStringSECRET_ALGORITHM="DES";

43privatestaticfinalStringPUBLIC_KEY="DHPublicKey";

44privatestaticfinalStringPRIVATE_KEY="DHPrivateKey";

45

46/**

47*初始化甲方密钥

48*

49*@return

50*@throwsException

51*/

52publicstaticMapinitKey()throwsException{

53KeyPairGeneratorkeyPairGenerator=KeyPairGenerator

54.getInstance(ALGORITHM);

55keyPairGenerator.initialize(KEY_SIZE);

56

57KeyPairkeyPair=keyPairGenerator.generateKeyPair();

58

59//甲方公钥

60DHPublicKeypublicKey=(DHPublicKey)keyPair.getPublic();

61

62//甲方私钥

63DHPrivateKeyprivateKey=(DHPrivateKey)keyPair.getPrivate();

64

65MapkeyMap=newHashMap

(2);

66

67keyMap.put(PUBLIC_KEY,publicKey);

68keyMap.put(PRIVATE_KEY,privateKey);

69returnkeyMap;

70}

71

72/**

73*初始化乙方密钥

74*

75*@paramkey

76*甲方公钥

77*@return

78*@throwsException

79*/

80publicstaticMapinitKey(Stringkey)throwsException{

81//解析甲方公钥

82byte[]keyBytes=decryptBASE64(key);

83X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(keyBytes);

84KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM);

85PublicKeypubKey=keyFactory.generatePublic(x509KeySpec);

86

87//由甲方公钥构建乙方密钥

88DHParameterSpecdhParamSpec=((DHPublicKey)pubKey).getParams();

89

90KeyPairGeneratorkeyPairGenerator=KeyPairGenerator

91.getInstance(keyFactory.getAlgorithm());

92keyPairGenerator.initialize(dhParamSpec);

93

94KeyPairkeyPair=keyPairGenerator.generateKeyPair();

95

96//乙方公钥

97DHPublicKeypublicKey=(DHPublicKey)keyPair.getPublic();

98

99//乙方私钥

100DHPrivateKeyprivateKey=(DHPrivateKey)keyPair.getPrivate();

101

102MapkeyMap=newHashMap

(2);

103

104keyMap.put(PUBLIC_KEY,publicKey);

105keyMap.put(PRIVATE_KEY,privateKey);

106

107returnkeyMap;

108}

109

110/**

111*加密

112*

113*@paramdata

114*待加密数据

115*@parampublicKey

116*甲方公钥

117*@paramprivateKey

118*乙方私钥

119*@return

120*@throwsException

121*/

122publicstaticbyte[]encrypt(byte[]data,StringpublicKey,

123StringprivateKey)throwsException{

124

125//生成本地密钥

126SecretKeysecretKey=getSecretKey(publicKey,privateKey);

127

128//数据加密

129Ciphercipher=Cipher.getInstance(secretKey.getAlgorithm());

130cipher.init(Cipher.ENCRYPT_MODE,secretKey);

131

132returncipher.doFinal(data);

133}

134

135/**

136*解密

137*

138*@paramdata

139*待解密数据

140*@parampublicKey

141*乙方公钥

142*@paramprivateKey

143*乙方私钥

144*@return

145*@throwsException

146*/

147publicstaticbyte[]decrypt(byte[]data,StringpublicKey,

148StringprivateKey)throwsException{

149

150//生成本地密钥

151SecretKeysecretKey=getSecretKey(publicKey,privateKey);

152//数据解密

153Ciphercipher=Cipher.getInstance(secretKey.getAlgorithm());

154cipher.init(Cipher.DECRYPT_MODE,secretKey);

155

156returncipher.doFinal(data);

157}

158

159/**

160*构建密钥

161*

162*@parampublicKey

163*公钥

164*@paramprivateKey

165*私钥

166*@return

167*@throwsException

168*/

169privatestaticSecretKeygetSecretKey(StringpublicKey,StringprivateKey)

170throwsException{

171//初始化公钥

172byte[]pubKeyBytes=decryptBASE64(publicKey);

173

174KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM);

175X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(pubKeyBytes);

176PublicKeypubKey=keyFactory.generatePublic(x509KeySpec);

177

178//初始化私钥

179byte[]priKeyBytes=decryptBASE64(privateKey);

180

181PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(priKeyBytes);

182KeypriKey=keyFactory.generatePrivate(pkcs8KeySpec);

183

184KeyAgreementkeyAgree=KeyAgreement.getInstance(keyFactory

185.getAlgorithm());

186keyAgree.init(priKey);

187keyAgree.doPhase(pubKey,true);

188

189//生成本地密钥

190SecretKeysecretKey=keyAgree.generateSecret(SECRET_ALGORITHM);

191

192returnsecretKey;

193}

194

195/**

196*取得私钥

197*

198*@paramkeyMap

199*@return

200*@throwsException

201*/

202publicstaticStringgetPrivateKey(MapkeyMap)

203throwsException{

204Keykey=(Key)keyMap.get(PRIVATE_KEY);

205

206returnencryptBASE64(key.getEncoded());

207}

208

209/**

210*取得公钥

211*

212*@paramkeyMap

213*@return

214*@throwsException

215*/

216publicstaticStringgetPublicKey(MapkeyMap)

217throwsException{

218Keykey=(Key)keyMap.get(PUBLIC_KEY);

219

220returnencryptBASE64(key.getEncoded());

221}

222}

再给出一个测试类:

Java代码

223importstaticorg.junit.Assert.*;

224

225importjava.util.Map;

226

227importorg.junit.Test;

228

229/**

230*

231*@author梁栋

232*@version1.0

233*@since1.0

234*/

235publicclassDHCoderTest{

236

237@Test

238publicvoidtest()throwsException{

239//生成甲方密钥对儿

240MapaKeyMap=DHCoder.initKey();

241StringaPublicKey=DHCoder.getPublicKey(aKeyMap);

242StringaPrivateKey=DHCoder.getPrivateKey(aKeyMap);

243

244System.err.println("甲方公钥:

\r"+aPublicKey);

245System.err.println("甲方私钥:

\r"+aPrivateKey);

246

247//由甲方公钥产生本地密钥对儿

248MapbKeyMap=DHCoder.initKey(aPublicKey);

249StringbPublicKey=DHCoder.getPublicKey(bKeyMap);

250StringbPrivateKey=DHCoder.getPrivateKey(bKeyMap);

251

252System.err.println("乙方公钥:

\r"+bPublicKey);

253System.err.println("乙方私钥:

\r"+bPrivateKey);

254

255StringaInput="abc";

256System.err.println("原文:

"+aInput);

257

258//由甲方公钥,乙方私钥构建密文

259byte[]aCode=DHCoder.encrypt(aInput.getBytes(),aPublicKey,

260bPrivateKey);

261

262//由乙方公钥,甲方私钥解密

263byte[]aDecode=DHCoder.decrypt(aCode,bPublicKey,aPrivateKey);

264StringaOutput=(newString(aDecode));

265

266System.err.println("解密:

"+aOutput);

267

268assertEquals(aInput,aOutput);

269

270System.err.println("===============反过来加密解密==================");

271StringbInput="def";

272System.err.println("原文:

"+bInput);

273

274//由乙方公钥,甲方私钥构建密文

275byte[]bCode=DHCoder.encrypt(bInput.getBytes(),bPublicKey,

276aPrivateKey);

277

278//由甲方公钥,乙方私钥解密

279byte[]bDecode=DHCoder.decrypt(bCode,aPublicKey,bPrivateKey);

280StringbOutput=(newString(bDecode));

281

282System.err.println("解密:

"+bOutput);

283

284assertEquals(bInput,bOutput);

285}

286

287}

控制台输出:

Console代码

288甲方公钥:

289MIHfMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYXrgHz

290W5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpDTWSG

291kx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgANDAAJAdAWBVmIzqcko

292Ej6qFjLDL2+Y3FPq1iRbnOyOpDj71yKaK1K+FhTv04B0zy4DKcvAASV7/Gv0W+bgqdmffRkqrQ==

293

294甲方私钥:

295MIHRAgEAMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYX

296rgHzW5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpD

297TWSGkx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgAQyAjACJRfy1LyR

298eHyD+4Hfb+xR0uoIGR1oL9i9Nk6g2AAuaDPgEVWHn+QXID13yL/uDos=

299

300乙方公钥:

301MIHfMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYXrgHz

302W5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpDTWSG

303kx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgANDAAJAVEYSfBA+I9nr

304dWw3OBv475C+eBrWBBYqt0m6/eu4ptuDQHwV4MmUtKAC2wc2nNrdb1wmBhY1X8RnWkJ1XmdDbQ==

305

306乙方私钥:

307MIHSAgEAMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcR

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1