RSA非对称加密 java后台不能解析安卓生成的密文
2018-03-29 10:22
441 查看
背景:java后台使用RSA能正确解析出密文
同理安卓也可以,但是安卓生成的密文在java后台确不能解析,具体方法如下:
需下载一个包:bcprov-jdk15on-159.jar
同时java后台:publicstaticfinalStringPADDING="RSA/NONE/NoPadding";
同理安卓也可以,但是安卓生成的密文在java后台确不能解析,具体方法如下:
需下载一个包:
同时java后台:publicstaticfinalStringPADDING="RSA/NONE/NoPadding";
安卓后台为
publicstaticfinalStringPADDING="RSAECB/NoPadding";
具体实现代码如下:
importjava.io.FileNotFoundException;
importjava.io.IOException;
importjava.security.Key;
importjava.security.KeyFactory;
importjava.security.KeyPair;
importjava.security.KeyPairGenerator;
importjava.security.NoSuchAlgorithmException;
importjava.security.NoSuchProviderException;
importjava.security.PrivateKey;
importjava.security.PublicKey;
importjava.security.Security;
importjava.security.interfaces.RSAPrivateKey;
importjava.security.interfaces.RSAPublicKey;
importjava.security.spec.InvalidKeySpecException;
importjava.security.spec.PKCS8EncodedKeySpec;
importjava.security.spec.X509EncodedKeySpec;
importjavax.crypto.Cipher;
importorg.apache.commons.codec.binary.Base64;
/**
*@authorJavaDigest
*
*/
publicclassEncryptionUtil{
/**
*Stringtoholdnameoftheencryptionalgorithm.
*/
publicstaticfinalStringALGORITHM="RSA";
/**
*Stringtoholdnameoftheencryptionpadding.
*/
publicstaticfinalStringPADDING="RSA/NONE/NoPadding";
/**
*Stringtoholdnameofthesecurityprovider.
*/
publicstaticfinalStringPROVIDER="BC";
/**
*Generatekeywhichcontainsapairofprivateandpublickeyusing1024
*bytes.StorethesetofkeysinPrvate.keyandPublic.keyfiles.
*
*@throwsNoSuchAlgorithmException
*@throwsIOException
*@throwsFileNotFoundException
*/
publicstaticvoidgenerateKey(){
try{
Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());
finalKeyPairGeneratorkeyGen=KeyPairGenerator.getInstance(
ALGORITHM,PROVIDER);
keyGen.initialize(256);
finalKeyPairkey=keyGen.generateKeyPair();
KeypublicKey=key.getPublic();
StringpublicKeyone=Base64.encodeBase64URLSafeString(publicKey.getEncoded());
//得到私钥
KeyprivateKey=key.getPrivate();
StringprivateKeyone=Base64.encodeBase64URLSafeString(privateKey.getEncoded());
System.out.println("publicKeyone====="+publicKeyone);
System.out.println("privateKeyone====="+privateKeyone);
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*得到公钥
*@parampublicKey密钥字符串(经过base64编码)
*@throwsNoSuchProviderException
*@throwsException
*/
publicstaticRSAPublicKeygetPublicKey(StringpublicKey)throwsNoSuchAlgorithmException,InvalidKeySpecException,NoSuchProviderException{
//通过X509编码的Key指令获得公钥对象
KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM,PROVIDER);
X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(Base64.decodeBase64(publicKey));
RSAPublicKeykey=(RSAPublicKey)keyFactory.generatePublic(x509KeySpec);
returnkey;
}
/**
*得到私钥
*@paramprivateKey密钥字符串(经过base64编码)
*@throwsNoSuchProviderException
*@throwsException
*/
publicstaticRSAPrivateKeygetPrivateKey(StringprivateKey)throwsNoSuchAlgorithmException,InvalidKeySpecException,NoSuchProviderException{
//通过PKCS#8编码的Key指令获得私钥对象
KeyFactorykeyFactory=KeyFactory.getInstance(ALGORITHM,PROVIDER);
PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
RSAPrivateKeykey=(RSAPrivateKey)keyFactory.generatePrivate(pkcs8KeySpec);
returnkey;
}
/**
*Encrypttheplaintextusingpublickey.
*
*@paramtext
*:originalplaintext
*@paramkey
*:Thepublickey
*@returnEncryptedtext
*@throwsjava.lang.Exception
*/
publicstaticbyte[]encrypt(Stringtext,PublicKeykey){
byte[]cipherText=null;
try{
//getanRSAcipherobjectandprinttheprovider
Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());
finalCiphercipher=Cipher.getInstance(PADDING,PROVIDER);
//encrypttheplaintextusingthepublickey
cipher.init(Cipher.ENCRYPT_MODE,key);
cipherText=cipher.doFinal(text.getBytes());
}catch(Exceptione){
e.printStackTrace();
}
returncipherText;
}
/**
*Decrypttextusingprivatekey.
*
*@paramtext
*:encryptedtext
*@paramkey
*:Theprivatekey
*@returnplaintext
*@throwsjava.lang.Exception
*/
publicstaticStringdecrypt(byte[]text,PrivateKeykey){
byte[]dectyptedText=null;
try{
//getanRSAcipherobjectandprinttheprovider
Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());
finalCiphercipher=Cipher.getInstance(PADDING,PROVIDER);
//decryptthetextusingtheprivatekey
cipher.init(Cipher.DECRYPT_MODE,key);
dectyptedText=cipher.doFinal(text);
}catch(Exceptionex){
ex.printStackTrace();
}
returnnewString(dectyptedText);
}
/**
*TesttheEncryptionUtil
*/
publicstaticvoidmain(String[]args){
/**
*生成秘钥对
**/
generateKey();
try{
finalStringoriginalText="4654654654";
/**
*获得公钥
**/
StringpublicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCkrHpXQobL3MMEbZtHvojCwkDqx-4awVbmLqXRNXgk4K-FQQIA-Z0fnSJ3pZ_pfOe5eO12wBkhq-p4PGdU9MrBZz077HyEsUHSTyzpsnMMOaoRwSPuRMPK-GKOQ0zZGR_PEI1YDpBS4rakWeve0Pn2JwhKkmsO4KluKcfIukoR-wIDAQAB";
StringprivateKey="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKSseldChsvcwwRtm0e-iMLCQOrH7hrBVuYupdE1eCTgr4VBAgD5nR-dIneln-l857l47XbAGSGr6ng8Z1T0ysFnPTvsfISxQdJPLOmycww5qhHBI-5Ew8r4Yo5DTNkZH88QjVgOkFLitqRZ697Q-fYnCEqSaw7gqW4px8i6ShH7AgMBAAECgYBWY3mG_4qRtk3Eq--TUrySV7AQuzQJazY4aW5p84AE8K6D3Je9hTXNmPS1Cfl7VyCFp5AEBUDp7jOCQkX_RrB6rd3PnBmZkc7_7nx8k2aQRuMHmFKTX4QU1TEh4zGba1Qpaqhe2XlNKAeKSvEAHAH-KTIYWSbSn0xwORAIL9WpsQJBAO6ftLz_eJBpbEEm6Hl01_uiAdNk4ZD_QfaSUHqsEbnj4z_jf3EmSx8SxslxJ_S8SuJ3Q4S7DJUTm86CQpE6VRMCQQCwqjwbwUy0RXY1e-dizRP0BhAoKobtW-MKsHYaRPrzY8Q2GBZjSi_IqxunGwDdo9V-F5od9pGVrBa22usP0DR5AkB0UTE-96EDdAAq-hZULhqiNGSDcSdrEKJM2SGVyo6ReH5rxC95Lltr-DEiPKBncelm3w_wgWUuvfIzBdgBBtg1AkAi6KCUA3A6tvcSvncMaOWmdIRAy5Z51Ixakl_j9Pl5mp8s6TmTSReEGXuPW6CiKzuGfPdxMEW4Q5cBbuS_7S5RAkEAibTYRrQE2QjujIxe34M6mTdTMx92FpGYzp_JftAYkVC-mYyrT-OUN67dPwz5pfqORisyCLVzPF6TY-i5merf7Q";
/**
*加密
**/
finalbyte[]cipherText=encrypt(originalText,getPublicKey(publicKey));
/**
*将密文转换为64
**/
Base64base64=newBase64();
StringcipherTextBase64=base64.encodeToString(cipherText);
/**
*密文64解密
**/
byte[]cipherTextArray=base64.decode(cipherTextBase64);
/**
*获得密文
**/
finalStringplainText=decrypt(cipherTextArray,getPrivateKey(privateKey));
PrintingtheOriginal,EncryptedandDecryptedText
System.out.println("Original="+originalText);
System.out.println("Encrypted="+cipherTextBase64);
System.out.println("Decrypted="+plainText);
}catch(Exceptione){
e.printStackTrace();
}
}
}
相关文章推荐
- RSA非对称加密 java后台不能解析安卓生成的密文
- OpenSSL生成证书进行iOS加密,java解密的RSA非对称加密 详解
- RSA非对称加密,使用OpenSSL生成证书,iOS加密,java解密
- Java实现的RSA非对称加密工具
- 使用RSA实现客户端和后台的非对称加密
- Android安全之非对称加密RSA密钥生成、加密、解密
- Java生成RSA非对称型加密的公钥和私钥
- Java对称与非对称加密解密,AES与RSA
- Java根据word模板生成word文档之后台解析和实现及部分代码(三)D
- Java生成RSA非对称型加密的公钥和私钥
- java实现RSA非对称加密算法 对数据进行加密【附代码】
- Java根据word模板生成word文档之后台解析和实现及部分代码(三)E
- java非对称加密的源代码(RSA)
- rsa实现js前台加密java后台解密
- Java生成RSA非对称型加密的公钥和私钥
- Java对称与非对称加密解密,AES与RSA
- RSA非对称加密工具JAVA实现
- 明文和密文是什么意思,以及flex与后台交互,Flex根据明文和密钥,采用DES加密算法进行加密,生成密文。