JAVA加密算法的实现用例

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

参数algorithm如:DSApublicfinalvoidinitSign(PrivateKeyprivateKey)throwsInvalidKeyException用指定的私钥初始化参数:privateKey所进行签名时用的私钥publicfinalvoidupdate(bytedata)throwsSignatureExceptionpublicfinalvoidupdate(byte[]data)throwsSignatureExceptionpublicfinalvoidupdate(byte[]data,intoff,intlen)throwsSignatureException添加要签名的信息publicfinalbyte[]sign()throwsSignatureException返回签名的数组,前提是initSign和updatepublicfinalvoidinitVerify(PublicKeypublicKey)throwsInvalidKeyException用指定的公钥初始化参数:publicKey验证时用的公钥publicfinalbooleanverify(byte[]signature)throwsSignatureException验证签名是否有效,前提是已经initVerify初始化参数:signature签名数组*/importjava.security.*;importjava.security.spec.*;publicclasstestdsa{publicstaticvoidmain(String[]args)throwsjava.security.NoSuchAlgorithmException,java.lang.Exception{testdsamy=newtestdsa();my.run();}publicvoidrun(){//数字签名生成密钥//第一步生成密钥对,如果已经生成过,本过程就可以跳过,对用户来讲myprikey.dat要保存在本地//而mypubkey.dat给发布给其它用户if((newjava.io.File(myprikey.dat)).exists()==false){if(generatekey()==false){System.out.println(生成密钥对败);return;};}//第二步,此用户//从文件中读入私钥,对一个字符串进行签名后保存在一个文件(myinfo.dat)中//并且再把myinfo.dat发送出去//为了方便数字签名也放进了myifno.dat文件中,当然也可分别发送try{java.io.ObjectInputStreamin=newjava.io.ObjectInputStream(newjava.io.FileInputStream(myprikey.dat));PrivateKeymyprikey=(PrivateKey)in.readObject();in.close();//java.security.spec.X509EncodedKeySpecpubX509=newjava.security.spec.X509EncodedKeySpec(bX509);//java.security.spec.X509EncodedKeySpecpubkeyEncode=java.security.spec.X509EncodedKeySpecStringmyinfo=这是我的信息;//要签名的信息//用私钥对信息生成数字签名java.security.Signaturesignet=java.security.Signature.getInstance(DSA);signet.initSign(myprikey);signet.update(myinfo.getBytes());byte[]signed=signet.sign();//对信息的数字签名System.out.println(signed(签名内容)=+byte2hex(signed));//把信息和数字签名保存在一个文件中java.io.ObjectOutputStreamout=newjava.io.ObjectOutputStream(newjava.io.FileOutputStream(myinfo.dat));out.writeObject(myinfo);out.writeObject(signed);out.close();System.out.println(签名并生成文件成功);}catch(java.lang.Exceptione){e.printStackTrace();System.out.println(签名并生成文件失败);};//第三步//其他人通过公共方式得到此户的公钥和文件//其他人用此户的公钥,对文件进行检查,如果成功说明是此用户发布的信息.//try{java.io.ObjectInputStreamin=newjava.io.ObjectInputStream(newjava.io.FileInputStream(mypubkey.dat));PublicKeypubkey=(PublicKey)in.readObject();in.close();System.out.println(pubkey.getFormat());in=newjava.io.ObjectInputStream(newjava.io.FileInputStream(myinfo.dat));Stringinfo=(String)in.readObject();byte[]signed=(byte[])in.readObject();in.close();java.security.Signaturesignetcheck=java.security.Signature.getInstance(DSA);signetcheck.initVerify(pubkey);signetcheck.update(info.getBytes());if(signetcheck.verify(signed)){System.out.println(info=+info);System.out.println(签名正常);}elseSystem.out.println(非签名正常);}catch(java.lang.Exceptione){e.printStackTrace();};}//生成一对文件myprikey.dat和mypubkey.dat---私钥和公钥,//公钥要用户发送(文件,网络等方法)给其它用户,私钥保存在本地publicbooleangeneratekey(){try{java.security.KeyPairGeneratorkeygen=java.security.KeyPairGenerator.getInstance(DSA);//SecureRandomsecrand=newSecureRandom();//secrand.setSeed(tttt.getBytes());//初始化随机产生器//keygen.initialize(576,secrand);//初始化密钥生成器keygen.initialize(512);KeyPairkeys=keygen.genKeyPair();//KeyPairkeys=keygen.generateKeyPair();//生成密钥组PublicKeypubkey=keys.getPublic();PrivateKeyprikey=keys.getPrivate();java.io.ObjectOutputStreamout=newjava.io.ObjectOutputStream(newjava.io.FileOutputStream(myprikey.dat));out.writeObject(prikey);out.close();System.out.println(写入对象prikeysok);out=newjava.io.ObjectOutputStream(newjava.io.FileOutputStream(mypubkey.dat));out.writeObject(pubkey);out.close();System.out.println(写入对象pubkeysok);System.out.println(生成密钥对成功);returntrue;}catch(java.lang.Exceptione){e.printStackTrace();System.out.println(生成密钥对失败);returnfalse;};}publicStringbyte2hex(byte[]b){Stringhs=;Stringstmp=;for(intn=0;nb.length;n++){stmp=(java.lang.Integer.toHexString(b[n]&0XFF));if(stmp.length()==1)hs=hs+0+stmp;elsehs=hs+stmp;if(nb.length-1)hs=hs+:;}returnhs.toUpperCase();}}2.4.DESede/DES对称算法首先生成密钥,并保存(这里并没的保存的代码,可参考DSA中的方法)KeyGeneratorkeygen=KeyGenerator.getInstance(Algorithm);SecretKeydeskey=keygen.generateKey();用密钥加密明文(myinfo),生成密文(cipherByte)Cipherc1=Cipher.getInstance(Algorithm);c1.init(Cipher.ENCRYPT_MODE,deskey);byte[]cipherByte=c1.doFinal(myinfo.getBytes());传送密文和密钥,本文没有相应代码可参考DSA.............用密钥解密密文c1=Cipher.getInstance(Algorithm);c1.init(Cipher.DECRYPT_MODE,deskey);byte[]clearByte=c1.doFinal(cipherByte);相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下SecretKeydeskey=keygen.generateKey();byte[]desEncode=deskey.getEncoded();javax.crypto.spec.SecretKeySpecdestmp=newjavax.crypto.spec.SecretKeySpec(desEncode,Algorithm);SecretKeymydeskey=destmp;相关APIKeyGenerator在DSA中已经说明,在添加JCE后在instance进可以如下参数DES,DESede,Blowfish,HmacMD5,HmacSHA1javax.crypto.Cipher加/解密器publicstaticfinalCiphergetInstance(java.lang.Stringtransformation)throwsjava.security.NoSuchAlgorithmException,NoSuchPaddingException返回一个指定方法的Cipher对象参数:transformation方法名(可用DES,DESede,Blowfish)publicfinalvoidinit(intopmode,java.security.Keykey)throwsjava.security.Invalid

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功