직접 코드에.
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