>백엔드 개발 >Golang >C#에서 Go까지: AES 및 Base64 인코딩 호환성 달성

C#에서 Go까지: AES 및 Base64 인코딩 호환성 달성

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-06 15:17:02863검색

De C# a Go: Logrando Compatibilidad en Codificación AES y Base64

몇 주 전에 저는 흥미로운 문제에 직면했습니다. 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 함수입니다. 이 함수는 결과의 차이를 설명하는 세 가지 주요 작업을 수행합니다.

  1. URL 안전 Base64 인코딩: URL에 적합한 Base64 변형을 사용하며 문자를 - 및 /를 _로 바꿉니다.

  2. 패딩 문자 제거: 이 기능은 패딩(표준 Base64 인코딩에서 일반적으로 사용되는 문자)을 제거합니다.

  3. 끝에 숫자 추가: 이 함수는 문자열 끝에 숫자를 추가하여 제거된 패딩 문자 수를 나타냅니다.

제가 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로 인코딩된 문자열 끝에 추가합니다.

  • len(pendedBytes)%3은 base64로 인코딩되지 않은 바이트 수를 계산합니다.
  • (4 - len(pendedBytes)%3) % 4는 길이가 4로 나누어질 수 있도록 누락된 패딩 문자 수를 계산합니다. 패딩이 필요하지 않은 경우 결과는 0입니다.

요컨대 문제는 AES 암호화 알고리즘이 아니라 base64 인코딩이었습니다. ChatGPT에서 얻은 정보 덕분에 Go의 구현을 C#과 호환되도록 수정할 수 있었습니다. 이 경우 ChatGPT를 사용하면 시간과 골치 아픈 일이 많이 줄어들어 매우 도움이 되었습니다. 물론 두 구현의 결과가 동일해질 때까지 각 답변을 조정해야 했습니다.

위 내용은 C#에서 Go까지: AES 및 Base64 인코딩 호환성 달성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.