Android RSA暗号解読実装
RSAは現在最も影響力のある公開鍵暗号化アルゴリズムであり、非対称暗号化アルゴリズムである.秘密鍵と秘密鍵のペアがランダムに生成され、復号者は秘密鍵を有し、秘密鍵計算によって生成された公開鍵を暗号化者に発行する.暗号化はいずれも公開鍵を用いて暗号化され、暗号文は復号者に送信され、復号者は秘密鍵で復号され、暗号文は明文に復号される.
以下はツールクラスで、直接使用できます.
base 64の符号化は、sqliteデータベースに格納されます.これにより、StringがPrivateKeyまたはPublicKeyに変換されるプロセスがあります.ここでは、主に上記のコードの2つの関数が使用されます.
以下はツールクラスで、直接使用できます.
package com.example.RsaCode;
import android.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.ObjectInputStream;
import java.math.BigInteger;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* Created with IntelliJ IDEA.
* User: zhangmin
* Module: Contacts
* Date: 14-5-26
* Time: 2:05
*/
public class RSACodeHelper {
public RSAPublicKey mPublicKey;
public RSAPrivateKey mPrivateKey;
public void initKey() {
KeyPairGenerator keyPairGen = null;
try {
//
keyPairGen = KeyPairGenerator.getInstance("RSA");
//
keyPairGen.initialize(512);
//
KeyPair keyPair = keyPairGen.generateKeyPair();
//
mPublicKey = (RSAPublicKey) keyPair.getPublic();
//
mPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
/****************************************
* :getPublicKey
*
* @param key
* @throws Exception
* @return PublicKey
* @author zhangmin
***************************************/
public static PublicKey getPublicKey(String key) throws Exception
{
byte[] keyBytes = base64Dec(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
/****************************************
* :getPrivateKey
*
* @param key
* @throws Exception
* @return PrivateKey
* @author zhangmin
***************************************/
public static PrivateKey getPrivateKey(String key) throws Exception
{
byte[] keyBytes = base64Dec(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
public String encrypt(String passwd) {
String strEncrypt = null;
try {
//
Cipher cipher = Cipher.getInstance("RSA");
//
byte[] plainText = passwd.getBytes();
//
cipher.init(Cipher.ENCRYPT_MODE, mPublicKey);
// , byte
byte[] enBytes = cipher.doFinal(plainText);
// byte base64
strEncrypt = base64Enc(enBytes);
} catch (IllegalBlockSizeException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvalidKeyException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (BadPaddingException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NoSuchAlgorithmException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NoSuchPaddingException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} finally {
return strEncrypt;
}
}
public String decrypt(String encString) {
Cipher cipher = null;
String strDecrypt = null;
try {
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, mPrivateKey);
// base64 byte
byte[] enBytes = base64Dec(encString);
// byte ,
byte[] deBytes = cipher.doFinal(enBytes);
strDecrypt = new String(deBytes);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (NoSuchPaddingException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (BadPaddingException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IllegalBlockSizeException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvalidKeyException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} finally {
return strDecrypt;
}
}
//base64
public static String base64Enc(byte[] enBytes) {
return Base64.encodeToString(enBytes, Base64.DEFAULT);
}
//base64
public static byte[] base64Dec(String str) {
return Base64.decode(str, Base64.DEFAULT);
}
}
呼び出し方法://
mRSAHelper = new RSACodeHelper();
mRSAHelper.initKey();
//
String encryptString = mRSAHelper.encrypt(mEditText.getText().toString());
// ,
String password = mRSAHelper.decrypt(encryptString);
一般的な実際の使用では、公開鍵と秘密鍵をbase 64の符号化は、sqliteデータベースに格納されます.これにより、StringがPrivateKeyまたはPublicKeyに変換されるプロセスがあります.ここでは、主に上記のコードの2つの関数が使用されます.
public static PublicKey getPublicKey(String key) throws Exception
public static PrivateKey getPrivateKey(String key) throws Exception
呼び出し方法: :String strPublicKey = base64Enc(mPublicKey.getEncoded())
:String strPrivateKey = base64Enc(mPrivateKey.getEncoded())
:RSAPublicKey publicKey = (RSAPublicKey)getPublicKey(strPublicKey);
:RSAPrivateKey privateKey = (RSAPrivateKey)getPrivateKey(strPrivateKey );
より強力な使用方法:パスワードはMD 5で暗号化して、更に明文のパスワードで秘密鍵にAESで暗号化して、復号するのも明文のパスワードを必要として、本当のデータファイルはRSAで暗号化して復号します.