MD5/SHA1
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907if.gif)
![](/icons/44907de.gif)
王辉([email protected])
2001年7月
第1章基础知识
1.1.单钥密码体制
单钥密码体制是
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou2.gif)
通常,使用
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou2.gif)
单钥密码体制
![](/icons/44907de.gif)
![](/icons/44907de.gif)
1.2.消息摘要
![](/icons/44907yi.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou.gif)
![](/icons/44907yi.gif)
![](/icons/44907yi.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907shuzu.gif)
![](/icons/44907dou2.gif)
消息摘要有两个基本属性:
两个区别
![](/icons/44907de.gif)
![](/icons/44907de.gif)
难以对指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
代表:美国国家标准技术研究所
![](/icons/44907de.gif)
![](/icons/44907de.gif)
1.3.D
![](/icons/44907if.gif)
![](/icons/44907yi.gif)
密钥
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907if.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou2.gif)
先决条件,允许两名用户在公开媒体上交换信息以生成\"
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
代表:指数密钥
![](/icons/44907yi.gif)
1.4.非对称算法和公钥体系
1976年
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
![](/icons/44907dou2.gif)
迄今为止
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
1.5.数字签名
所谓数字签名就是信息发送者用其私钥对从所传报文中提取出
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
在数字签名中有重要作用
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907hanshu.gif)
![](/icons/44907hanshu.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907hanshu.gif)
![](/icons/44907de.gif)
接受
![](/icons/44907de.gif)
对任何输入报文数据生成固定长度
![](/icons/44907de.gif)
从报文能方便地算出摘要;
难以对指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
两个区别
![](/icons/44907de.gif)
![](/icons/44907de.gif)
代表:DSA
第2章在JAVA中
![](/icons/44907de.gif)
2.1.相关
D
![](/icons/44907if.gif)
![](/icons/44907yi.gif)
![](/icons/44907chengxu.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
2.2.消息摘要MD5和SHA
![](/icons/44907de.gif)
使用思路方法:
首先用生成
![](/icons/44907yi.gif)
java.security.MessageDigestalga=java.security.MessageDigest.getInstance(\"SHA-1\");
添加要进行计算摘要
![](/icons/44907de.gif)
alga.update(myinfo.getBytes
![](/icons/44907kh.gif)
计算出摘要
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
发送给其他人你
![](/icons/44907de.gif)
其他人用相同
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
algb.isEqual(digesta,algb.digest
![](/icons/44907kh.gif)
相关AIP
java.security.MessageDigest类
![](/icons/44907static.gif)
返回
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
参数:算法名,如SHA-1或MD5
voidupdate(
![](/icons/44907byte.gif)
voidupdate(
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
voidupdate(
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907int.gif)
![](/icons/44907set.gif)
![](/icons/44907int.gif)
添加要进行计算摘要
![](/icons/44907de.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
完成计算,返回计算得到
![](/icons/44907de.gif)
voidre
![](/icons/44907set.gif)
![](/icons/44907kh.gif)
复位
![](/icons/44907static.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
比效两个摘要是否相同
代码:
importjava.security.*;
public
![](/icons/44907class.gif)
public
![](/icons/44907static.gif)
![](/icons/44907main.gif)
![](/icons/44907zhk2.gif)
myDigestmy=
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
my.testDigest
![](/icons/44907kh.gif)
}
publicvoidtestDigest
![](/icons/44907kh.gif)
{
try{
Stringmyinfo=\"我
![](/icons/44907de.gif)
//java.security.MessageDigestalg=java.security.MessageDigest.getInstance(\"MD5\");
java.security.MessageDigestalga=java.security.MessageDigest.getInstance(\"SHA-1\");
alga.update(myinfo.getBytes
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907byte.gif)
//通过某中方式传给其他人你
![](/icons/44907de.gif)
java.security.MessageDigestalgb=java.security.MessageDigest.getInstance(\"SHA-1\");
algb.update(myinfo.getBytes
![](/icons/44907kh.gif)
![](/icons/44907if.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
![](/icons/44907else.gif)
{
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
}
catch(java.security.NoSuchAlgorithmExceptionex){
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
}
publicString
![](/icons/44907byte.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907zifu.gif)
{
Stringhs=\"\";
Stringstmp=\"\";
for(
![](/icons/44907int.gif)
![](/icons/44907jiajia.gif)
{
stmp=(java.lang.Integer.toHexString(b[n]&0XFF));
![](/icons/44907if.gif)
![](/icons/44907kh.gif)
![](/icons/44907dd.gif)
![](/icons/44907else.gif)
![](/icons/44907if.gif)
}
![](/icons/44907return.gif)
![](/icons/44907kh.gif)
}
}
2.3.数字签名DSA
对于
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
生成
![](/icons/44907yi.gif)
java.security.KeyPairGeneratorkeygen=java.security.KeyPairGenerator.getInstance(\"DSA\");
如果设定随机产生器就用如相代码
![](/icons/44907chushi.gif)
SecureRandomsecrand=
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
secrand.
![](/icons/44907set.gif)
![](/icons/44907kh.gif)
![](/icons/44907chushi.gif)
keygen.initialize(512,secrand);//
![](/icons/44907chushi.gif)
否则
keygen.initialize(512);
生成密钥公钥pubkey和私钥prikey
KeyPairkeys=keygen.generateKeyPair
![](/icons/44907kh.gif)
PublicKeypubkey=keys.getPublic
![](/icons/44907kh.gif)
PrivateKeyprikey=keys.getPrivate
![](/icons/44907kh.gif)
分别保存在myprikey.dat和mypubkey.dat中,以便下次不在生成
(生成密钥对
![](/icons/44907de.gif)
java.io.ObjectOutputStreamout=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
out.writeObject(prikey);
out.close
![](/icons/44907kh.gif)
out=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
out.writeObject(pubkey);
out.close
![](/icons/44907kh.gif)
用他私人密钥(prikey)对他所确认
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907shuzu.gif)
从文件中读入私人密钥(prikey)
java.io.ObjectInputStreamin=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
PrivateKeymyprikey=(PrivateKey)in.readObject
![](/icons/44907kh.gif)
in.close
![](/icons/44907kh.gif)
![](/icons/44907chushi.gif)
![](/icons/44907yi.gif)
java.security.Signaturesignet=java.security.Signature.getInstance(\"DSA\");
signet.initSign(myprikey);
signet.update(myinfo.getBytes
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
把信息和签名保存在
![](/icons/44907yi.gif)
java.io.ObjectOutputStreamout=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
out.writeObject(myinfo);
out.writeObject(signed);
out.close
![](/icons/44907kh.gif)
把他
![](/icons/44907de.gif)
![](/icons/44907de.gif)
其他用户用他
![](/icons/44907de.gif)
![](/icons/44907de.gif)
读入公钥
java.io.ObjectInputStreamin=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
PublicKeypubkey=(PublicKey)in.readObject
![](/icons/44907kh.gif)
in.close
![](/icons/44907kh.gif)
读入签名和信息
in=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
Stringinfo=(String)in.readObject
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
in.close
![](/icons/44907kh.gif)
![](/icons/44907chushi.gif)
![](/icons/44907yi.gif)
java.security.Signaturesignetcheck=java.security.Signature.getInstance(\"DSA\");
signetcheck.initVer
![](/icons/44907if.gif)
signetcheck.update(info.getBytes
![](/icons/44907kh.gif)
![](/icons/44907if.gif)
![](/icons/44907if.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
对于密钥
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
importjava.security.spec.*
importjava.security.*
具休介绍说明如下
publickey是用X.509编码
![](/icons/44907de.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
//传送 2进制编码
//以下代码转换编码为相应key对象
X509EncodedKeySpecbobPubKeySpec=
![](/icons/44907new.gif)
KeyFactorykeyFactory=KeyFactory.getInstance(\"DSA\");
PublicKeybobPubKey=keyFactory.generatePublic(bobPubKeySpec);
对于Privatekey是用PKCS#8编码,例码如下:
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
//传送 2进制编码
//以下代码转换编码为相应key对象
PKCS8EncodedKeySpecpriPKCS8=
![](/icons/44907new.gif)
KeyFactorykeyf=KeyFactory.getInstance(\"DSA\");
PrivateKeyotherprikey=keyf.generatePrivate(priPKCS8);
常用API
java.security.KeyPairGenerator密钥生成器类
public
![](/icons/44907static.gif)
以指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
参数:algorithm算法名.如:\"DSA\",\"RSA\"
publicvoidinitialize(
![](/icons/44907int.gif)
以指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
![](/icons/44907chushi.gif)
参数:keysize算法位长.其范围必须在512到1024的间
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
publicvoidinitialize(
![](/icons/44907int.gif)
以指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
![](/icons/44907chushi.gif)
参数:keysize算法位长.其范围必须在512到1024的间
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
random
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907int.gif)
publicabstractKeyPairgenerateKeyPair
![](/icons/44907kh.gif)
产生新密钥对
java.security.KeyPair密钥对类
publicPrivateKeygetPrivate
![](/icons/44907kh.gif)
返回私钥
publicPublicKeygetPublic
![](/icons/44907kh.gif)
返回公钥
java.security.Signature签名类
public
![](/icons/44907static.gif)
返回
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
参数algorithm如:\"DSA\"
publicfinalvoidinitSign(PrivateKeyprivateKey)
throwsInvalidKeyException
用指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
参数:privateKey所进行签名时用
![](/icons/44907de.gif)
publicfinalvoidupdate(
![](/icons/44907byte.gif)
throwsSignatureException
publicfinalvoidupdate(
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
throwsSignatureException
publicfinalvoidupdate(
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907int.gif)
![](/icons/44907int.gif)
throwsSignatureException
添加要签名
![](/icons/44907de.gif)
publicfinal
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
throwsSignatureException
返回签名
![](/icons/44907de.gif)
![](/icons/44907shuzu.gif)
publicfinalvoidinitVer
![](/icons/44907if.gif)
throwsInvalidKeyException
用指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
参数:publicKey验证时用
![](/icons/44907de.gif)
publicfinalbooleanver
![](/icons/44907if.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
throwsSignatureException
验证签名是否有效,前提是已经initVer
![](/icons/44907if.gif)
![](/icons/44907chushi.gif)
参数:signature签名
![](/icons/44907shuzu.gif)
*/
importjava.security.*;
importjava.security.spec.*;
public
![](/icons/44907class.gif)
public
![](/icons/44907static.gif)
![](/icons/44907main.gif)
![](/icons/44907zhk2.gif)
testdsamy=
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
my.run
![](/icons/44907kh.gif)
}
publicvoidrun
![](/icons/44907kh.gif)
{
//数字签名生成密钥
//第
![](/icons/44907yi.gif)
//而mypubkey.dat给发布给其它用户
![](/icons/44907if.gif)
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
![](/icons/44907dd.gif)
![](/icons/44907if.gif)
![](/icons/44907kh.gif)
![](/icons/44907dd.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907return.gif)
};
}
//第 2步,此用户
//从文件中读入私钥,对
![](/icons/44907yi.gif)
![](/icons/44907zifu.gif)
![](/icons/44907yi.gif)
//并且再把myinfo.dat发送出去
//为了方便数字签名也放进了my
![](/icons/44907if.gif)
try{
java.io.ObjectInputStreamin=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
PrivateKeymyprikey=(PrivateKey)in.readObject
![](/icons/44907kh.gif)
in.close
![](/icons/44907kh.gif)
//java.security.spec.X509EncodedKeySpecpubX509=
![](/icons/44907new.gif)
//java.security.spec.X509EncodedKeySpecpubkeyEncode=java.security.spec.X509EncodedKeySpec
Stringmyinfo=\"这是我
![](/icons/44907de.gif)
![](/icons/44907de.gif)
//用私钥对信息生成数字签名
java.security.Signaturesignet=java.security.Signature.getInstance(\"DSA\");
signet.initSign(myprikey);
signet.update(myinfo.getBytes
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907de.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907byte.gif)
//把信息和数字签名保存在
![](/icons/44907yi.gif)
java.io.ObjectOutputStreamout=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
out.writeObject(myinfo);
out.writeObject(signed);
out.close
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
catch(java.lang.Exceptione){
e.pr
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
};
//第 3步
//其他人通过公共方式得到此户
![](/icons/44907de.gif)
//其他人用此户
![](/icons/44907de.gif)
![](/icons/44907de.gif)
//
try{
java.io.ObjectInputStreamin=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
PublicKeypubkey=(PublicKey)in.readObject
![](/icons/44907kh.gif)
in.close
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
in=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
Stringinfo=(String)in.readObject
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
in.close
![](/icons/44907kh.gif)
java.security.Signaturesignetcheck=java.security.Signature.getInstance(\"DSA\");
signetcheck.initVer
![](/icons/44907if.gif)
signetcheck.update(info.getBytes
![](/icons/44907kh.gif)
![](/icons/44907if.gif)
![](/icons/44907if.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
![](/icons/44907else.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
catch(java.lang.Exceptione){e.pr
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
}
//生成
![](/icons/44907yi.gif)
//公钥要用户发送(文件,网络等思路方法)给其它用户,私钥保存在本地
publicbooleangeneratekey
![](/icons/44907kh.gif)
{
try{
java.security.KeyPairGeneratorkeygen=java.security.KeyPairGenerator.getInstance(\"DSA\");
//SecureRandomsecrand=
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
//secrand.
![](/icons/44907set.gif)
![](/icons/44907kh.gif)
![](/icons/44907chushi.gif)
//keygen.initialize(576,secrand);//
![](/icons/44907chushi.gif)
keygen.initialize(512);
KeyPairkeys=keygen.genKeyPair
![](/icons/44907kh.gif)
//KeyPairkeys=keygen.generateKeyPair
![](/icons/44907kh.gif)
PublicKeypubkey=keys.getPublic
![](/icons/44907kh.gif)
PrivateKeyprikey=keys.getPrivate
![](/icons/44907kh.gif)
java.io.ObjectOutputStreamout=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
out.writeObject(prikey);
out.close
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
out=
![](/icons/44907new.gif)
![](/icons/44907new.gif)
out.writeObject(pubkey);
out.close
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907return.gif)
}
catch(java.lang.Exceptione){
e.pr
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907return.gif)
};
}
publicString
![](/icons/44907byte.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
{
Stringhs=\"\";
Stringstmp=\"\";
for(
![](/icons/44907int.gif)
![](/icons/44907jiajia.gif)
{
stmp=(java.lang.Integer.toHexString(b[n]&0XFF));
![](/icons/44907if.gif)
![](/icons/44907kh.gif)
![](/icons/44907dd.gif)
![](/icons/44907else.gif)
![](/icons/44907if.gif)
}
![](/icons/44907return.gif)
![](/icons/44907kh.gif)
}
}
2.4.DESede/DES对称算法
首先生成密钥,并保存(这里并没
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
KeyGeneratorkeygen=KeyGenerator.getInstance(Algorithm);
SecretKeydeskey=keygen.generateKey
![](/icons/44907kh.gif)
用密钥加密明文(myinfo),生成密文(cipherByte)
Cipherc1=Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskey);
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
传送密文和密钥,本文没有相应代码可参考DSA
.............
用密钥解密密文
c1=Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
相对来说对称密钥
![](/icons/44907de.gif)
![](/icons/44907de.gif)
对于密钥
![](/icons/44907de.gif)
SecretKeydeskey=keygen.generateKey
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
javax.crypto.spec.SecretKeySpecdestmp=
![](/icons/44907new.gif)
SecretKeymydeskey=destmp;
相关API
KeyGenerator在DSA中已经介绍说明,在添加JCE后在instance进可以如下参数
DES,DESede,Blowfish,HmacMD5,HmacSHA1
javax.crypto.Cipher加/解密器
public
![](/icons/44907static.gif)
throwsjava.security.NoSuchAlgorithmException,
NoSuchPaddingException
返回
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
参数:transformation思路方法名(可用DES,DESede,Blowfish)
publicfinalvoidinit(
![](/icons/44907int.gif)
throwsjava.security.InvalidKeyException
用指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
参数:opmode方式(ENCRYPT_MODE,DECRYPT_MODE,WRAP_MODE,UNWRAP_MODE)
key密钥
publicfinal
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
throwsjava.lang.IllegalStateException,
IllegalBlockSizeException,
BadPaddingException
对input内
![](/icons/44907de.gif)
![](/icons/44907de.gif)
注意:本思路方法
![](/icons/44907de.gif)
![](/icons/44907de.gif)
/*
安全
![](/icons/44907chengxu.gif)
*/
importjava.security.*;
importjavax.crypto.*;
public
![](/icons/44907class.gif)
public
![](/icons/44907static.gif)
![](/icons/44907main.gif)
![](/icons/44907zhk2.gif)
testdesmy=
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
my.run
![](/icons/44907kh.gif)
}
publicvoidrun
![](/icons/44907kh.gif)
//添加新安全算法,如果用JCE就要把它添加进去
Security.addProvider(
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
StringAlgorithm=\"DES\";//定义加密算法,可用DES,DESede,Blowfish
Stringmyinfo=\"要加密
![](/icons/44907de.gif)
try{
//生成密钥
KeyGeneratorkeygen=KeyGenerator.getInstance(Algorithm);
SecretKeydeskey=keygen.generateKey
![](/icons/44907kh.gif)
//加密
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
![](/icons/44907byte.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
Cipherc1=Cipher.getInstance(Algorithm);
c1.init(Cipher.ENCRYPT_MODE,deskey);
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
![](/icons/44907byte.gif)
//解密
c1=Cipher.getInstance(Algorithm);
c1.init(Cipher.DECRYPT_MODE,deskey);
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
![](/icons/44907byte.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
![](/icons/44907new.gif)
}
catch(java.security.NoSuchAlgorithmExceptione1){e1.pr
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
catch(javax.crypto.NoSuchPaddingExceptione2){e2.pr
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
catch(java.lang.Exceptione3){e3.pr
![](/icons/44907int.gif)
![](/icons/44907kh.gif)
}
publicString
![](/icons/44907byte.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907zifu.gif)
{
Stringhs=\"\";
Stringstmp=\"\";
for(
![](/icons/44907int.gif)
![](/icons/44907jiajia.gif)
{
stmp=(java.lang.Integer.toHexString(b[n]&0XFF));
![](/icons/44907if.gif)
![](/icons/44907kh.gif)
![](/icons/44907dd.gif)
![](/icons/44907else.gif)
![](/icons/44907if.gif)
}
![](/icons/44907return.gif)
![](/icons/44907kh.gif)
}
}
2.5.D
![](/icons/44907if.gif)
![](/icons/44907yi.gif)
公开密钥密码体制
![](/icons/44907de.gif)
![](/icons/44907if.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907chushi.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
KeyPairGeneratoraliceKpairGen=KeyPairGenerator.getInstance(\"DH\");
aliceKpairGen.initialize(512);
KeyPairaliceKpair=aliceKpairGen.generateKeyPair
![](/icons/44907kh.gif)
alice生成公钥发送组bob
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907kh.gif)
bob从alice发送来
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
![](/icons/44907de.gif)
注意这
![](/icons/44907yi.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
![](/icons/44907de.gif)
DHParameterSpecdhParamSpec=((DHPublicKey)alicePubKey).getParams
![](/icons/44907kh.gif)
KeyPairGeneratorbobKpairGen=KeyPairGenerator.getInstance(\"DH\");
bobKpairGen.initialize(dhParamSpec);
KeyPairbobKpair=bobKpairGen.generateKeyPair
![](/icons/44907kh.gif)
bob根据alice
![](/icons/44907de.gif)
![](/icons/44907de.gif)
KeyAgreementbobKeyAgree=KeyAgreement.getInstance(\"DH\");
bobKeyAgree.init(bobKpair.getPrivate
![](/icons/44907kh.gif)
bobKeyAgree.doPhase(alicePubKey,true);
SecretKeybobDesKey=bobKeyAgree.generateSecret(\"DES\");
bob已经生成了他
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907kh.gif)
alice根据bob
![](/icons/44907de.gif)
![](/icons/44907de.gif)
,,,,,,解码
KeyAgreementaliceKeyAgree=KeyAgreement.getInstance(\"DH\");
aliceKeyAgree.init(aliceKpair.getPrivate
![](/icons/44907kh.gif)
aliceKeyAgree.doPhase(bobPubKey,true);
SecretKeyaliceDesKey=aliceKeyAgree.generateSecret(\"DES\");
bob和alice能过这个过程就生成了相同
![](/icons/44907de.gif)
常用API
java.security.KeyPairGenerator密钥生成器类
public
![](/icons/44907static.gif)
throwsNoSuchAlgorithmException
以指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
参数:algorithm算法名.如:原来是DSA,现在添加了D
![](/icons/44907if.gif)
publicvoidinitialize(
![](/icons/44907int.gif)
以指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
![](/icons/44907chushi.gif)
参数:keysize算法位长.其范围必须在512到1024的间
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
注意:如果用1024生长
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
publicvoidinitialize(AlgorithmParameterSpecparams)
throwsInvalidAlgorithmParameterException
以指定参数
![](/icons/44907chushi.gif)
javax.crypto.
![](/icons/44907int.gif)
publicDHParameterSpecgetParams
![](/icons/44907kh.gif)
返回
java.security.KeyFactory
public
![](/icons/44907static.gif)
throwsNoSuchAlgorithmException
以指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
参数:algorithm算法名:DSH,DH
publicfinalPublicKeygeneratePublic(KeySpeckeySpec)
throwsInvalidKeySpecException
根据指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
java.security.spec.X509EncodedKeySpec
publicX509EncodedKeySpec(
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
根据指定
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
参数:encodedKey 2进制编码
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907kh.gif)
javax.crypto.KeyAgreement密码
![](/icons/44907yi.gif)
public
![](/icons/44907static.gif)
throwsjava.security.NoSuchAlgorithmException
返回
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
参数:algorithm算法名,现在只能是D
![](/icons/44907if.gif)
publicfinalvoidinit(java.security.Keykey)
throwsjava.security.InvalidKeyException
用指定
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
参数:key
![](/icons/44907yi.gif)
publicfinaljava.security.KeydoPhase(java.security.Keykey,
booleanlastPhase)
throwsjava.security.InvalidKeyException,
java.lang.IllegalStateException
用指定
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907de.gif)
情况下就可以多次定次,最后确定
参数:key公钥
lastPhase是否最后公钥
publicfinalSecretKeygenerateSecret(java.lang.Stringalgorithm)
throwsjava.lang.IllegalStateException,
java.security.NoSuchAlgorithmException,
java.security.InvalidKeyException
根据指定
![](/icons/44907de.gif)
参数:algorithm加密算法(可用DES,DESede,Blowfish)
*/
importjava.io.*;
importjava.math.BigInteger;
importjava.security.*;
importjava.security.spec.*;
importjava.security.
![](/icons/44907int.gif)
importjavax.crypto.*;
importjavax.crypto.spec.*;
importjavax.crypto.
![](/icons/44907int.gif)
importcom.sun.crypto.provider.SunJCE;
public
![](/icons/44907class.gif)
public
![](/icons/44907static.gif)
![](/icons/44907main.gif)
![](/icons/44907zhk2.gif)
try{
testDHKeymy=
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
my.run
![](/icons/44907kh.gif)
}catch(Exceptione){
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
}
privatevoidrun
![](/icons/44907kh.gif)
Security.addProvider(
![](/icons/44907new.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
KeyPairGeneratoraliceKpairGen=KeyPairGenerator.getInstance(\"DH\");
aliceKpairGen.initialize(512);
KeyPairaliceKpair=aliceKpairGen.generateKeyPair
![](/icons/44907kh.gif)
//张 3(Alice)生成公共密钥alicePubKeyEnc并发送给李 4(Bob),
//比如用文件方式,
![](/icons/44907socket.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907kh.gif)
//bob接收到alice
![](/icons/44907de.gif)
![](/icons/44907de.gif)
KeyFactorybobKeyFac=KeyFactory.getInstance(\"DH\");
X509EncodedKeySpecx509KeySpec=
![](/icons/44907new.gif)
PublicKeyalicePubKey=bobKeyFac.generatePublic(x509KeySpec);
![](/icons/44907System.gif)
![](/icons/44907int.gif)
//bob必须用相同
![](/icons/44907de.gif)
![](/icons/44907chushi.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
//中读出参数,再用这个参数
![](/icons/44907chushi.gif)
![](/icons/44907de.gif)
//从alicePubKye中取alice
![](/icons/44907chushi.gif)
![](/icons/44907de.gif)
DHParameterSpecdhParamSpec=((DHPublicKey)alicePubKey).getParams
![](/icons/44907kh.gif)
KeyPairGeneratorbobKpairGen=KeyPairGenerator.getInstance(\"DH\");
bobKpairGen.initialize(dhParamSpec);
KeyPairbobKpair=bobKpairGen.generateKeyPair
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
KeyAgreementbobKeyAgree=KeyAgreement.getInstance(\"DH\");
bobKeyAgree.init(bobKpair.getPrivate
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907chushi.gif)
//李 4(bob)生成本地
![](/icons/44907de.gif)
bobKeyAgree.doPhase(alicePubKey,true);
SecretKeybobDesKey=bobKeyAgree.generateSecret(\"DES\");
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
//Bob生成公共密钥bobPubKeyEnc并发送给Alice,
//比如用文件方式,
![](/icons/44907socket.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
//alice接收到bobPubKeyEnc后生成bobPubKey
//再进行定位,使aliceKeyAgree定位在bobPubKey
KeyFactoryaliceKeyFac=KeyFactory.getInstance(\"DH\");
x509KeySpec=
![](/icons/44907new.gif)
PublicKeybobPubKey=aliceKeyFac.generatePublic(x509KeySpec);
![](/icons/44907System.gif)
![](/icons/44907int.gif)
;
KeyAgreementaliceKeyAgree=KeyAgreement.getInstance(\"DH\");
aliceKeyAgree.init(aliceKpair.getPrivate
![](/icons/44907kh.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907chushi.gif)
aliceKeyAgree.doPhase(bobPubKey,true);
//张 3(alice)生成本地
![](/icons/44907de.gif)
SecretKeyaliceDesKey=aliceKeyAgree.generateSecret(\"DES\");
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
![](/icons/44907if.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
//现在张 3和李 4
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
//安全通道
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
/*
*bob用bobDesKey密钥加密信息
*/
CipherbobCipher=Cipher.getInstance(\"DES\");
bobCipher.init(Cipher.ENCRYPT_MODE,bobDesKey);
Stringbobinfo=\"这是李 4
![](/icons/44907de.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907kh.gif)
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
/*
*alice用aliceDesKey密钥解密
*/
CipheraliceCipher=Cipher.getInstance(\"DES\");
aliceCipher.init(Cipher.DECRYPT_MODE,aliceDesKey);
![](/icons/44907byte.gif)
![](/icons/44907zhk2.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
![](/icons/44907de.gif)
![](/icons/44907new.gif)
![](/icons/44907if.gif)
throw
![](/icons/44907new.gif)
![](/icons/44907System.gif)
![](/icons/44907int.gif)
}
}
第3章小结
在加密术中生成密钥对时
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907yi.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
![](/icons/44907de.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
有关作者
王辉
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou.gif)
![](/icons/44907de.gif)
![](/icons/44907dou2.gif)
![](/icons/44907yi.gif)
![](/icons/44907chengxu.gif)
![](/icons/44907dou.gif)
![](/icons/44907dou2.gif)
最新评论