몇 주 전에 저는 흥미로운 문제에 직면했습니다. AES 암호화 알고리즘을 C#에서 Go로 마이그레이션해야 했습니다. Go 구현에는 이미 AES 암호화 알고리즘이 있었지만 C# 구현과 호환되지 않았고 주로 마지막 문자에서 결과가 일치하지 않아 여러 테스트가 실패했습니다.
문제는 C# 구현 소스코드가 없고 .NET 프로젝트에서 사용했던 DLL인 바이너리만 있다는 점이었습니다.
C# 구현의 소스 코드를 얻으려고 했지만 실패했습니다. 오래된 프로젝트이기 때문에 사용 가능한 문서가 없었습니다. 다행히 이 구현을 개발한 사람은 내 상사였지만 정확한 내용은 기억나지 않았습니다. 그런데 AES 암호화 과정 마지막에 base64 인코딩 기능이 사용된 것으로 알고 있었습니다.
이 단서를 가지고 .NET에서 프로젝트를 열고 JetBrains 확장 프로그램을 설치하여 소스 코드를 디컴파일하고 정보를 암호화하는 데 사용된 라이브러리 코드를 얻었습니다.
드디어 문제가 AES 암호화 알고리즘이 아닌 base64 인코딩에 있다는 것을 발견했습니다.
C# 코드에서는 AES 암호화 프로세스 마지막에 base64 인코딩에 HttpServerUtility.UrlTokenEncode 함수가 사용되었습니다.
UrlTokenEncode 함수는 URL 전송을 위해 바이트 배열을 base64 텍스트 문자열로 인코딩하는 .NET 함수입니다. 이 함수는 결과의 차이를 설명하는 세 가지 주요 작업을 수행합니다.
URL 안전 Base64 인코딩: URL에 적합한 Base64 변형을 사용하며 문자를 - 및 /를 _로 바꿉니다.
패딩 문자 제거: 이 기능은 패딩(표준 Base64 인코딩에서 일반적으로 사용되는 문자)을 제거합니다.
끝에 숫자 추가: 이 함수는 문자열 끝에 숫자를 추가하여 제거된 패딩 문자 수를 나타냅니다.
제가 Base64 전문가여서가 아니라 ChatGPT 덕분에 이 모든 것을 발견했습니다. 이 정보를 통해 Go의 구현을 C#의 구현과 호환되도록 수정할 수 있었습니다.
Go에서는 정보를 AES로 암호화한 후 다음과 같이 base64 인코딩을 합니다.
encode := base64.RawURLEncoding.EncodeToString(paddedBytes)
마지막으로 제거된 패딩 문자의 수가 문자열 끝에 추가됩니다.
// Calcular el número de caracteres de relleno (`=`) que se habrían añadido paddingCount := (4 - len(paddedBytes)%3) % 4 // Añadir el conteo de relleno al final de la cadena codificada (como hace UrlTokenEncode de C#) if paddingCount > 0 { encoded += strconv.Itoa(paddingCount) }
paddingCount := (4 - len(pendedBytes)%3) % 4 줄에서 패딩 문자(=)의 수를 계산한 다음 base64로 인코딩된 문자열 끝에 추가합니다.
요컨대 문제는 AES 암호화 알고리즘이 아니라 base64 인코딩이었습니다. ChatGPT에서 얻은 정보 덕분에 Go의 구현을 C#과 호환되도록 수정할 수 있었습니다. 이 경우 ChatGPT를 사용하면 시간과 골치 아픈 일이 많이 줄어들어 매우 도움이 되었습니다. 물론 두 구현의 결과가 동일해질 때까지 각 답변을 조정해야 했습니다.
위 내용은 C#에서 Go까지: AES 및 Base64 인코딩 호환성 달성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!