자바 구현 RSA 암호 화 알고리즘 상세 설명

본 고의 실례 는 자바 가 실현 한 RSA 암호 화 알고리즘 을 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
비대 칭 암호 화
1.암호 화 된 키 는 암호 화 된 키 와 다 릅 니 다.이러한 암호 화 알고리즘 을 비대 칭 암호 화 라 고 합 니 다.
2.키 는 공개 키,비밀 키 로 나 뉜 다.
공개 키:대외 적 으로 누구 에 게 나 암호 화 되 고 복호화 할 수 있 는 비밀 번 호 는 공개 적 입 니 다.
비밀 키:비밀 키 를 통 해 공개 키 를 생 성 할 수 있 지만 공개 키 에서 공개 키 를 생 성 할 수 없다 고 여 겨 집 니 다(유도 되 는 확률 은 고려 하지 않 을 정도 로 작 습 니 다)
3.암호 화 할 내용 을 공개 키 로 암호 화 할 때 비밀 키 로 만 복호화 할 수 있 습 니 다.
암호 화 할 내용 을 비밀 키 로 암호 화 할 때 공개 키 로 만 복호화 할 수 있 습 니 다.
4.공개 키 와 비밀 키 의 관 계 는 간단 한 공식 을 이용 하여 공개 키 와 비밀 키 를 생 성 한다.즉,비대 칭 암호 화 된 공개 키 와 비밀 키 사이 에 특정한 공식 적 인 관계 가 존재 한다.
5.흔히 볼 수 있 는 비대 칭 암호 화 알고리즘
RSA,DSA
2.RSA 알고리즘 이 무엇 입 니까?
RSA 알고리즘 은 비대 칭 암호 화 알고리즘 입 니 다.비대 칭 이란 이 알고리즘 이 한 쌍 의 키 가 필요 하고 그 중 하 나 를 사용 하면 다른 하 나 를 사용 해 야 복호화 할 수 있 습 니 다.
RSA 의 알고리즘 은 세 개의 매개 변수,n,e1,e2 와 관련된다.
그 중에서 n 은 두 개의 큰 질 수 p,q 의 적 이 고 n 의 바 이 너 리 는 표시 할 때 사용 하 는 자릿수 이 며 이른바 키 길이 입 니 다.
e1 과 e2 는 한 쌍 의 관련 값 으로 e1 은 임의로 취 할 수 있 으 나 e1 과(p-1)*(q-1)의 상호 질 을 요구한다.e2,요구(e2*e1)mod((p-1)*(q-1)=1 을 선택 하 십시오.
(n,e1),(n,e2)키 쌍 입 니 다.그 중에서(n,e1)은 공개 키 이 고(n,e2)는 비밀 키 이다.
RSA 복호화 알고리즘 은 똑 같 습 니 다.A 를 명문 으로 설정 하고 B 를 비밀문 으로 설정 하면 A=B^e2 mod n;B=A^e1 mod n;(공개 키 암호 화 시스템 에서 일반적으로 공개 키 로 암호 화하 고 비밀 키 로 복호화 합 니 다)
e1 과 e2 는 교환 해서 사용 할 수 있다.즉,:
A=B^e1 mod n;B=A^e2 mod n;
3.RSA 암호 화 알고리즘 의 사용
1.RSA 키 생 성,KeyPair 대상 되 돌리 기
KeyPair 는 비대 칭 암호 화 에 사 용 됩 니 다.KeyPair 에는 공개 키 와 비밀 키 가 포함 되 어 있 습 니 다.

/**
*                   
* @param keySize     1024,2048 ,     1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keySize){
    KeyPair ret = null;
    try {
      //1、    
      KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
      //2、   ,      
      generator.initialize(keySize);
      //3、  ,    
      ret = generator.generateKeyPair();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return ret;
}

2.비밀 키 와 공개 키 가 져 오기
PublicKey 와 PrivateKey 는 모두 Key 타 입 입 입 니 다.

KeyPair keyPair = EncryptUtil.generateRSAKeyPair(1024);
//    ,      
PublicKey publicKey = keyPair.getPublic();
 //    
PrivateKey privateKey = keyPair.getPrivate();

3.RSA 암호 화

/**
* RSA   
* @param data        
* @param key     PublicKey,    PrivateKey
* @return
*/
public static byte[] rsaEncrypt(byte[] data ,Key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、  Cipher   RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //  Key
        cipher.init(Cipher.ENCRYPT_MODE,key);
        ret = cipher.doFinal(data);
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        e.printStackTrace();
      } catch (InvalidKeyException e) {
        e.printStackTrace();
      } catch (BadPaddingException e) {
        e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
      }
    }
    return ret;
}

4.RSA 복호화

/**
* RSA   
* @param data       
* @param key     PublicKey,    PrivateKey
* @return
*/
public static byte[] rsaDecrypt(byte[] data ,Key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、  Cipher   RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //  Key
        cipher.init(Cipher.DECRYPT_MODE,key);
        ret = cipher.doFinal(data);
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        e.printStackTrace();
      } catch (InvalidKeyException e) {
        e.printStackTrace();
      } catch (BadPaddingException e) {
        e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
      }
    }
    return ret;
}

5.공개 키 와 비밀 키 의 저장
공개 키 와 비밀 키 를 만 든 후에 우 리 는 저장 한 후에 사용 해 야 한다.

//       
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//   PublicKey PrivateKey         ,        、       
byte[] publicKeyEncoded = publicKey.getEncoded();
byte[] privateKeyEncoded = privateKey.getEncoded();
//       Base64               
String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP);
String privatekey = Base64.encodeToString(privateKeyEncoded, Base64.NO_WRAP);
//      
 。。。。

6.공개 키 와 비밀 키 의 로드
보통 1.키 쌍 2 가 져 오기,공개 키 가 져 오기,비밀 키 3 가 져 오기,공개 키 저장,비밀 키 저장,저장 형식 은 기본적으로 문자열 형식 입 니 다.
그러면 앞으로 사용 할 때 공개 키 와 비밀 키 를 가 져 와 서 사용 해 야 합 니 다.
알 아야 할 것:
6.1 KeyFactory 는 해당 하 는 공개 키 와 비밀 키 를 불 러 올 수 있 습 니 다.
6.2.공개 키 로 딩 사용X509EncodedKeySpec(byte[])6.3.비밀 키 로 딩 사용PCKS8EncodedKeySpec(byte[])

//    
//str_publickey           (      byte[]        )
//  
byte[] publicdecode = Base64.decode(new String(str_publickey), Base64.NO_WRAP);
//  X509EncodedKeySpec  
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
//      
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//    
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
//  
//    
//str_private            
byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
//  X509EncodedKeySpec  
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
//      
keyFactory = KeyFactory.getInstance("RSA");
//    
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

PS:암호 화 복호화 에 관심 이 있 는 친 구 는 본 사이트 의 온라인 도 구 를 참고 할 수 있 습 니 다.
MD5 온라인 암호 화 도구:
http://tools.jb51.net/password/CreateMD5Password
천둥,급행열차,회오리 URL 암호 화/복호화 도구:
http://tools.jb51.net/password/urlrethunder
온라인 해시/해시 알고리즘 암호 화 도구:
http://tools.jb51.net/password/hash_encrypt
온라인 MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 암호 화 도구:
http://tools.jb51.net/password/hash_md5_sha
온라인 sha 1/sha 224/sha 256/sha 384/sha 512 암호 화 도구:
http://tools.jb51.net/password/sha_encode
자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기