2013-07-22 4 views
5

사용된 SharedPreferences에 공개/개인 키를 작성하고 그것을 내가 암호화하고, 내 키를 만들 모든 공공/민간 keys.First와 텍스트를 해독하고이 코드로 된 SharedPreferences에 저장하려고

SharedPreferences SP; 

SharedPreferences.Editor SPE; 

KeyPairGenerator keyGen; 

KeyPair keypair; 

PublicKey publicKey; 

PrivateKey privateKey; 

keyGen = KeyPairGenerator.getInstance("RSA"); 

keyGen.initialize(1024);   

keypair = keyGen.genKeyPair(); 

privateKey = keypair.getPrivate(); 

publicKey = keypair.getPublic(); 

SPE = SP.edit(); 

SPE.putString("PublicKey", publicKey.toString()); 

SPE.putString("PrivateKey", privateKey.toString()); 

SPE.commit(); 

한 PublicKey : RSA 공개 키

계수 : d07b8f32968cf65301fd710f9d6d036feac01d7b98c92ff979cd324d252cb257ff48d6630b33f0f68bd0ee8 내 된 SharedPreferences 파일에서

는, 키는 다음과 같이 기록되어있다 1c3a83502a0abf0b263dc96c2b86940f7ec19ab1865626383e55cf5a37e25ef4eb6ca88a39f31becb6065434bc2236177aa5b35266fe0379164faea6ef7a92812e7aa3ef5fc488c70ab085f5564f09c0f6e927b49

공개 지수

: 10001

의 PrivateKey : RSA 개인 CRT 키

계수 : d07b8f32968cf65301fd710f9d6d036feac01d7b98c92ff979cd324d252cb257ff48d6630b33f0f68bd0ee81c3a83502a0abf0b263dc96c2b86940f7ec19ab1865626383e55cf5a37e25ef4eb6ca88a39f31becb6065434bc2236177aa5b35266fe0379164faea6ef7a92812e7aa3ef5fc488c70ab085f5564f09c0f6e927b49

공개 지수 : 1000 1 개
개인 지수 : 67ebef696c1a3fff0892e8f4bba8477a562e05844298a6cd58a5ac59401a939bc1a8f114d5d4c25c633d766640bd6c0f2f4005ef265022e6553e4220531448702e4bbf4322b9d5cf444d16eea151e5d565412b49208a73d9236607475d201affa21d374e3186f14b651b08565be4725f89fc6797a79c8433c4dd089589284a01

primeP : ee4ad1a56f4ee3b12c198d09b08a92c349f94cc79a6143ca7140fa64c919f2d9c24c29d3b413fdc4039000b6b5feac5a764ce436db4a4a382d8ceecbc768e0d1

primeQ : 2ce01e :

primeExponentP dff9a761807440b4a5a4fb04ebaa22849f6543f33168bd6e83b3c549b346661124d7879e168c1009e97c01b3fdcd7088eebd9c989b64d7c4b81ea46f9e06d0f9 371f8d25c819dbfdf9932ba593ed7c6b7f338d99aca8436a644c92fc6f11ee31fa5271695adea8e1d986d09d38b40aaaf7c1b86dddc28645fa4e656be1

primeExponentQ : 21904af9fc82ef5362e3474ea4763978005eef80d92da5fd92b4f4e2a77fec39b378acf50ed1ec715fd0da7c7b9336c2fe6be1b4a8ccc2dcd2ee9c9bb165ba19

crtCoefficient :

:

d8ccccb874ec4c2d464e84829547507e1ebf78e506caa77950b04329957b8713e80553874b825bf5c90b214984b4657b64965867460d87aab135f43930db48ec 그리고이 코드는 내가이 키를 읽으려고하고있다

하지만 뭔가 잘못되었습니다. 이것은 InvalidKeySpecException을 제공합니다. 열쇠에서 파일을 읽을 수 없습니다.이 문제를 어떻게 해결할 수 있습니까? 고맙습니다.

답변

9

확인. 나는 해결책을 찾았고 뭔가를 바꿨다. 이것은 public/private 키를 저장하고 저장된 문자열에서 다시 가져 오는 새로운 클래스입니다. 이 수업은 저에게 효과적입니다!

import java.security.KeyFactory; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.NoSuchAlgorithmException; 
import java.security.NoSuchProviderException; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.SecureRandom; 
import java.security.spec.InvalidKeySpecException; 
import java.security.spec.X509EncodedKeySpec; 
import org.bouncycastle.util.encoders.Base64; 
import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 

public class KeyGenerator extends Activity{ 

    SharedPreferences SP; 
    SharedPreferences.Editor SPE; 
    PublicKey pubKey; 
    PrivateKey privKey; 
    Context context; 

    public KeyGenerator(Context context){ 
     this.context = context; 
     SP = context.getSharedPreferences("KeyPair", MODE_PRIVATE); 
    } 

    public void generateKeys(){ 
     try { 
      KeyPairGenerator generator; 
      generator = KeyPairGenerator.getInstance("RSA", "BC"); 
      generator.initialize(256, new SecureRandom()); 
      KeyPair pair = generator.generateKeyPair(); 
      pubKey = pair.getPublic(); 
      privKey = pair.getPrivate();    
      byte[] publicKeyBytes = pubKey.getEncoded(); 
      String pubKeyStr = new String(Base64.encode(publicKeyBytes)); 
      byte[] privKeyBytes = privKey.getEncoded(); 
      String privKeyStr = new String(Base64.encode(privKeyBytes));    
      SPE = SP.edit(); 
      SPE.putString("PublicKey", pubKeyStr); 
      SPE.putString("PrivateKey", privKeyStr);   
      SPE.commit(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     }   
    } 
    public PublicKey getPublicKey(){ 
     String pubKeyStr = SP.getString("PublicKey", "");  
     byte[] sigBytes = Base64.decode(pubKeyStr); 
     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes); 
     KeyFactory keyFact = null; 
     try { 
      keyFact = KeyFactory.getInstance("RSA", "BC"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     } 
     try { 
      return keyFact.generatePublic(x509KeySpec); 
     } catch (InvalidKeySpecException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    public String getPublicKeyAsString(){ 
     return SP.getString("PublicKey", "");  
    } 
    public PrivateKey getPrivateKey(){ 
     String privKeyStr = SP.getString("PrivateKey", ""); 
     byte[] sigBytes = Base64.decode(privKeyStr); 
     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(sigBytes); 
     KeyFactory keyFact = null; 
     try { 
      keyFact = KeyFactory.getInstance("RSA", "BC"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchProviderException e) { 
      e.printStackTrace(); 
     } 
     try { 
      return keyFact.generatePrivate(x509KeySpec); 
     } catch (InvalidKeySpecException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    public String getPrivateKeyAsString(){ 
     return SP.getString("PrivateKey", "");  
    } 
} 
4

위의 (아마도 아래) 허용 된 코드를 보내 주셔서 감사합니다. 그러나 제 경우에는 'getPrivatekey()'가 InvalidKeySpecException을 던집니다. 그것은 'Unknown KeySpc type : java.secrity.spec.X509EncodedKeySpec'이라고 말합니다.내가 사용한 솔루션은 X509EncodedKeySpec을 PKCS8EncodedKeySpec으로 대체하는 것입니다. 그렇다면 그것은 작동합니다! 참조 : https://stackoverflow.com/a/9755391/2481444