Android RSA暗号解読実装


RSAは現在最も影響力のある公開鍵暗号化アルゴリズムであり、非対称暗号化アルゴリズムである.秘密鍵と秘密鍵のペアがランダムに生成され、復号者は秘密鍵を有し、秘密鍵計算によって生成された公開鍵を暗号化者に発行する.暗号化はいずれも公開鍵を用いて暗号化され、暗号文は復号者に送信され、復号者は秘密鍵で復号され、暗号文は明文に復号される.
以下はツールクラスで、直接使用できます.
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で暗号化して復号します.