您的位置:首页 > 编程语言 > Java开发

RSA非对称加密 java后台不能解析安卓生成的密文

2018-03-29 10:22 441 查看
背景:java后台使用RSA能正确解析出密文
     同理安卓也可以,但是安卓生成的密文在java后台确不能解析,具体方法如下:

     需下载一个包:bcprov-jdk15on-159.jar
     同时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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: