2010-06-02 5 views
10

Base-64로 인코딩 된 공개 키로 바이트 배열의 RSA 암호화를 수행하는 방법은 무엇입니까?RSA는 Android에서 base64로 인코딩 된 공개 키로 암호화합니다.

자바에서 RSA 암호화를 수행하는 방법에 (구글 검색) 기사의 몇을 읽은 후 다음 코드를 발견

public byte[] rsaEncrypt(byte[] data) { 
    PublicKey pubKey = readKeyFromFile("/public.key"); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
    byte[] cipherData = cipher.doFinal(src); 
    return cipherData; 
} 

나는 base64로 인코딩 된 문자열 (126 자), 방법 등의 공개 키를 가지고 인코딩 된 문자열로 'PublicKey'를 만들고 Cipher와 함께 사용하십시오.

+0

Base64 인코딩 된 문자열에 무엇이 들어 있는지 어떻게 알 수 있습니까? 아마도 모듈과 공개 지수 일 것이지만, 어떤 형태입니까? * 아마 X509EncodedKeySpec의 DER 인코딩. –

답변

8

base64 문자열은 X509EncodedKeySpec 일 수 있습니다. 나는 단지 짐작할 수있다. 그렇다면 문자열을 base64로 디코딩하여 byte []을 얻어야합니다. 그런 다음 byte []에서 X509EncodedKeySpec을 작성하십시오. 그런 다음 RSA KeyFactory의 인스턴스를 만들고이 KeyFactory의 generatePublic() 메서드를 사용하여 PublicKey을 가져옵니다. 이 공개 키는 Cipher.init()으로 전달 될 수 있습니다.

참고 : base64 디코딩을 수행하려면 apache commons codec 또는 the Harder base64 decoder을 사용하십시오.

UPDATE 2017년 3월 8일 : 더 늦게보다 결코 뉴스, 자바 (8) 지금은 Base64 인코딩/디코딩 클래스가 포함에서, java.util.Base64

4

이 아래 공용 및 개인 키 쌍 을 생성 할 수있는 방법입니다 하드 디스크에 저장하는 기능입니다

enter code here 
public static void GenerateKeyPair() 
{  
    try{ 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(2048); 
     KeyPair kp = kpg.genKeyPair(); 

     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(), 
      RSAPublicKeySpec.class); 
     RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(), 
      RSAPrivateKeySpec.class); 

     saveToFile("public.key", pub.getModulus(), 
        pub.getPublicExponent()); 
     saveToFile("private.key", priv.getModulus(), 
        priv.getPrivateExponent()); 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 
} 

public static void saveToFile(String fileName, 
    BigInteger mod, BigInteger exp) throws Exception { 
    ObjectOutputStream oout = new ObjectOutputStream(
    new BufferedOutputStream(new FileOutputStream(fileName))); 
    try { 
    oout.writeObject(mod); 
    oout.writeObject(exp); 
    } catch (Exception e) { 
    throw new Exception("error", e); 
    } finally { 
    oout.close(); 
    } 
} 
관련 문제