3DES, 부속서 C # 콘솔 응용 프로그램 및 Java 암호화 및 암호 해독 결과의 일관성을 예 고 말했다 무엇에 해당 DESede에서 TripleDES를 C #, 자바

직접 코드에.

Java 콘솔 코드 :

패키지 테스트; 

가져 오기 를 java.security.Key; 

수입 javax.crypto.Cipher에;
수입 javax.crypto.SecretKeyFactory;
수입 javax.crypto.spec.DESedeKeySpec;
수입 javax.crypto.spec.IvParameterSpec; 

수입 org.apache.commons.codec.binary.Base64; 

공용  클래스 테스트 {
     개인  정적  최종 문자열 인코딩 = "UTF-8" ; 

    공공  정적  무효 메인 (문자열 []에 args) {
         시도 { 
            문자열 텍스트 = "20200121"; // 明文
            키 = 문자열 "Tt3rLPrDIVIhXqAz"; // 길이 제어 (16), 3DES 암호화 키와 같은 
            문자열 encryptStr = EncryptData (텍스트, 키); // 3DES 암호화 결과 

            에서 System.out.println ( "일반 텍스트 :"+ 텍스트) 
            시스템 .out.println ( "키"+ 키) 
            에서 System.out.println ( "암호문 :"+ encryptStr) 
            에서 System.out.println ( "암호 해독 :"+ DecryptData (encryptStr, 키)); 
        } 캐치 (예외 E) { 
            e.printStackTrace ();
        } 
    } 

    / ** 
     *는 DESede 암호화 키 길이는 16 
     * 
     * @param평문明文
     * @param의 키密钥
     * @return DESede加密结果
     * @throws 예외
      * / 
    정적 스트링 EncryptData은 (문자열 평문 문자열 키)를 발생 예외 { 

        바이트 [] = keyBytes key.getBytes (부호화);
        경우 (keyBytes.length == 16) { // 짧은 키? .. 24 바이트까지 확장 키 
            바이트 [] = tmpKey 새로운  바이트 [24 ]; 
            System.arraycopy에 (keyBytes, 0 tmpKey, 0, 16 ); 
            System.arraycopy에 (keyBytes,0 tmpKey, 16, 8 ); 
            keyBytes = tmpKey; 
        } 

        키 deskey = 널 (null) ; 
        DESedeKeySpec의 사양 = 새로운 DESedeKeySpec의 (keyBytes); 
        KeyFactory에의 SecretKeyFactory = SecretKeyFactory.getInstance ( "desede" ); 
        deskey = keyfactory.generateSecret (사양); 
        암호화 암호 = Cipher.getInstance ( "desede / CBC / PKCS5Padding에" ); 

        경우 (keyBytes.length> 8 ) {
             바이트 [] = tmpKey 새로운  바이트 [8 ];
            System.arraycopy에 (keyBytes, 0 tmpKey 0 ,. 8 ) 
            keyBytes = tmpKey; 
        } 

        IvParameterSpec의 IPS = 새로운 새 IvParameterSpec의 (keyBytes) 
        cipher.init (Cipher.ENCRYPT_MODE가 Deskey는 IPS) 
        바이트 [] = 그럴 Cipher.doFinal (plainText.getBytes ()는 부호화) 

        복귀 Base64.encodeBase64String (시합) 
    } 

    / ** 
     *는 DESede 암호 해독 키 길이는 16 
     * 
     * @param의 입력이 DESede 결과 암호화 
     * @param의 주요 키 
     * @return DESede 복호 결과 
     *@throws 예외
      * / 
    정적 스트링 DecryptData은 (문자열 입력 문자열 키)를 발생 예외 {
         바이트 [] = keyBytes key.getBytes (부호화);
        경우 (keyBytes.length == 16) { // 짧은 키? .. 24 바이트까지 확장 키 
            바이트 [] = tmpKey 새로운  바이트 [24 ]; 
            System.arraycopy에 (keyBytes, 0 tmpKey, 0, 16 ); 
            System.arraycopy에 (keyBytes, 0 tmpKey, 16, 8 ); 
            keyBytes = tmpKey; 
        } 

        키 deskey의 =널 (null) ; 
        DESedeKeySpec의 사양 = 새로운 DESedeKeySpec의 (keyBytes); 
        KeyFactory에의 SecretKeyFactory = SecretKeyFactory.getInstance ( "desede" ); 
        deskey = keyfactory.generateSecret (사양); 
        암호화 암호 = Cipher.getInstance ( "desede / CBC / PKCS5Padding에" ); 

        경우 (keyBytes.length> 8 ) {
             바이트 [] = tmpKey 새로운  바이트 [8 ]; 
            System.arraycopy에 (keyBytes, 0 tmpKey, 0, 8 ); 
            keyBytes = tmpKey; 
        }

        IvParameterSpec의 IPS는 = 새로운 IvParameterSpec의 (keyBytes)를; 
        cipher.init (cipher를 Cipher.DECRYPT_MODE는 deskey는 IPS); 
        바이트 [] = BOUT cipher.doFinal (Base64.decodeBase64 (입력)); 

        반환  새로운 문자열 (시합, 인코딩); 
    } 

}

C # 콘솔 코드 :

사용하여 시스템,
 사용하여 다루려면 System.Text를,
 (가) 사용 에서는 System.Security.Cryptography를,
 사용 System.IO를, 

네임 스페이스를 테스트 
{ 
    클래스 프로그램 
    { 
        정적  무효 메인 ( 문자열 []에 args) 
        { 
            은 try 
            { 
                문자열 텍스트 = " 20200121 " ; // 일반 텍스트 
                문자열 키 = " Tt3rLPrDIVIhXqAz " ; // 3DES 암호화 키와 같은 길이 제어부 (16), 
                문자열 encryptStr = EncryptData (텍스트, 키);// 3DES 암호화 결과 

                Console.WriteLine ( " 일반 텍스트 : " + 텍스트); 
                Console.WriteLine ( " 키 : " + 키); 
                Console.WriteLine ( " 암호문 : " + encryptStr); 
                Console.WriteLine ( " 암호 해독 : " + DecryptData (encryptStr, 키)); 
                Console.Read (); 
            } 
            캐치 (예외 EX) 
            { 
                Console.WriteLine ( " 이상 동작의 이상 정보 : " + + ex.Messageex.StackTrace) 
                Console.WriteLine ( " 눌러 시도를 종료 할 임의의 키 " ) 
                Console.Read는 (); 
            } 

        } 

        ///  <요약> 
        /// 된 TRIPLEDES 암호화 키 길이는 16
         ///  </ 요약> 
        ///  <PARAM NAME = "일반 텍스트"> 일반 </ PARAM> 
        ///  <PARAM NAME = "키"> </ PARAM> 
        ///  <반품> TripleDES를 암호화 결과 </ 반품> 
        공공  정적  문자열 EncryptData ( 문자열 일반 텍스트, 문자열 키) 
        {
            TripleDES를 TripleDESCryptoServiceProvider = 새로운 새 TripleDESCryptoServiceProvider ();
             // Tripledes.Mode = CipherMode.ECB;
             // Tripledes.Padding = PaddingMode.PKCS7; 
            바이트 [] = B_INPUT Encoding.UTF8.GetBytes (평문)
             의 바이트 [] = b_key Encoding.UTF8 .GetBytes (키) 
            MemoryStream을 TempStream = 새로운 새 MemoryStream을 ();
             // rgbKey 즉 대칭 알고리즘의 키, rgbIV 즉 대칭 알고리즘 초기화 벡터, b_key 본원에서 사용되는 
            CryptoStream을 encStream = 새로운 새 , b_input.Length); CryptoStream을 (TempStream, TripleDES를. CreateEncryptor와 (b_key, b_key) CryptoStreamMode.Write );
            encStream.Write (B_INPUT, 0 
        {
            encStream.Close (); 
            리턴 Convert.ToBase64String (tempStream.ToArray는 ()); 
        } 

        ///  <요약> 
        /// TripleDES를 복호 키 길이는 16
         ///  </ 요약> 
        ///  "= <PARAM 이름 INPUT "> TripleDES를 암호화 결과 </ PARAM> 
        ///  <PARAM NAME ="키 "> </ PARAM> 
        ///  <반품> TripleDES를 해독 결과 </ 반품> 
        공공  정적  문자열 DecryptData ( 문자열 입력, 문자열 키) 
            TripleDESCryptoServiceProvider TripleDES를이 = 새로운 새로운TripleDESCryptoServiceProvider ()
             의 바이트 [] = B_INPUT Convert.FromBase64String (INPUT)
             바이트 [] = b_key Encoding.UTF8.GetBytes (키) 
            MemoryStream을 TempStream = 새로운 새 MemoryStream을 ();
             // rgbKey 즉, 대칭 키 알고리즘, rgbIV 즉 대칭 초기화 벡터, b_key 본원에서 사용되는 알고리즘 
            CryptoStream을 encStream = 새로운 새 CryptoStream을 (TempStream, Tripledes.CreateDecryptor (b_key, b_key) CryptoStreamMode.Write) 
            encStream.Write (B_INPUT, 0 , b_input.Length) 
            encStream .FlushFinalBlock (); 
            리턴 Encoding.UTF8.GetString (tempStream.ToArray ());
        } 

    } 
}

다음과 같이 자바와 C # 실행 결과는 일치한다 :

일반 텍스트 : 20,200,121
키 : Tt3rLPrDIVIhXqAz
암호문 : jHaDswvQaPn4ZvashXOTNQ ==
암호 해독 : 20200121

첫째 내 CSDN 블로그 등장이 문서 : https://blog.csdn.net/n_ithero/article/details/104061959

추천

출처www.cnblogs.com/xuezhizhang/p/TripleDES.html