Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr
  • 0

JAVA SHA-256 암호화 코딩을 델파이로 변환


midaskpp

질문

안녕하세요. 

자바로 된 SHA-256 암호화 구분을 델파이로 변환 할려고 합니다. 

 public static String encrypt(String base) {
        try{
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(base.getBytes("UTF-8"));
            StringBuffer hexString = new StringBuffer();

            for (int i = 0; i < hash.length; i++) {
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

            return hexString.toString();
        } catch(Exception ex){
            throw new RuntimeException(ex);
        }
    }

------------------------------------------------------------------------

위의 자바 코드에서 아래 2가지 문법이 이해가 가지 않습니다.

1.            byte[] hash = digest.digest(base.getBytes("UTF-8")); 

2.            String hex = Integer.toHexString(0xff & hash[i]);

델파이로 어떻게 코딩 해야 할지 잘 모르겠습니다.

그리고  if(hex.length() == 1) hexString.append('0'); 은 

길이가 1일때 왜 '0'을 추가하라는지 법칙인가요? 아니면 보안을 위한 형식인가요?

자바 고수님들 염치없지만  참고자료나 델파이로 구현 방법  힌트라도 부탁드립니다.

 

델파이10.4 아키텍쳐를 사용하고 있습니다.

즐거운 하루 되세요.....

이 댓글 링크
다른 사이트에 공유하기

6 answers to this question

Recommended Posts

  • 0

올려주신 자바코드는 제가 이해하기로는, 

SHA256으로 암호화한 바이트배열(byte [])을 HEX 문자열로 변환한 함수 같습니다.

샘플 데이터를 위 코드 실행한 반환 값은 델파이로 변환한 값과 동일할 것 같습니다.

20190114131056783AE1841E52783A >>> 689ed3f9a92e7d9cace97ed95051d51de1678a365ef3325a6ad661f61a98851a

다음 코드는 자바코드를 델파이로 그대로 변환한 코드이며, 기존에 작성하신 코드와 같은 결과를 표시합니다.

  var Hash := THashSHA2.GetHashBytes(UTF8Encode(Edit1.Text), THashSHA2.TSHA2Version.SHA256);
  var HexStr: string := '';
  for var I := 0 to Length(Hash) - 1 do
  begin
    var Hex: string := (Hash[I] and $FF).ToHexString(2);
    HexStr := HexStr + Hex;
  end;
  Edit2.Text := HexStr.ToLower;

  Edit3.Text := AnsiToUtf8(THashSHA2.GetHashString(Edit1.Text, THashSHA2.TSHA2Version.SHA256).ToLower);

질문하신 자바코드를 해석하면 다음과 같습니다.

On 2021. 9. 27. at 오전 11시 17분, midaskpp said:

byte[] hash = digest.digest(base.getBytes("UTF-8")); 

문자열을 UTF8로 인코딩합니다.(숫자와 문자는 UTF8로 인코딩해도 동일한 값을 반환합니다.)

 

On 2021. 9. 27. at 오전 11시 17분, midaskpp said:

String hex = Integer.toHexString(0xff & hash[i]);

0xff & hash[i]의 "&" AND연산자입니다.(보통 마스킹을 위해 AND연산을 사용합니다.)

0XFF는 풀비트이므로, 연산하기 전후의 값은 동일하므로 해당 코드는 불필요한 코드입니다.

 

참고로 길이가 1인경우 "0"을 붙이는 이유는, 

SHA256으로 인코딩한 바이트배열의 길이는 32로, 하나의 바이트를 2글자로 표현하기위한 코드입니다.

 

결론으로

자바 encrypt 함수로 변환한 결과와 작성하신 델파이 코드로 변환한 결과는 같아야 할 것 같습니다.

 

다른 이유를 제가 예상하기로는(자바로 인코딩 시 다른 값이 나오는 이유는)

1) 변환할 대상 데이터가 다르거나(해당 함수 호출 전 다른 로직이 실행 되어서)

2) 인코딩 이후에 다른 코드가 있을 것으로 예상됩니다.

 

이 댓글 링크
다른 사이트에 공유하기

  • 0

저는 자바 코드는 잘 몰라서 자바소스를 컨버젼하는것은 제외 하고 아래 주소들을 보시면 델파이에서 SHA256 암호화하는 예제들이 있습니다.

도움이 되셨으면 좋겠습니다. 해결되시면 댓글로 달아주시면 다른 분들도 공유해서 보실 수 있을것입니다.

https://auroradp.tistory.com/9
https://gist.github.com/MrRobot-prog/b4f76467c376be6348ae0dd42e3aabc5
https://fossies.org/linux/peazip/sha256.pas

이 댓글 링크
다른 사이트에 공유하기

  • 0

고수님들 답변 감사합니다.. 링크래주신 예제 열심히 테스트 하고 있습니다.

20190114131056(시간: 14자리)+ 783AE1841E52783A (KEY) 라서 

20190114131056783AE1841E52783A 를 암호화 하면  

결과값  3d119c75bf54e1982827b8d92e6da4072acd25d8b6f6d226c0572fa6fcda745d

이렇게 나와야 하는데 아무리 해도

689ed3f9a92e7d9cace97ed95051d51de1678a365ef3325a6ad661f61a98851a

이렇게 나옵니다. 다른사이트 암호화 결과 확인해도 동일하게 나오구요 위에처럼(689e... 으로)

 

99999.thumb.png.a0d35841fef964892bbebed4cb893537.png

그래서 위의 자바 구문은 보면 해시로 암호화 해서 또 값은 가공을 하는게 아닌지 궁금합니다.

아래구문처럼 델파이로 코디을해야 정확한 값이 나오는지 잘모르겠네요.. 

for (int i = 0; i < hash.length; i++) {
                String hex = Integer.toHexString(0xff & hash[i]);
                if(hex.length() == 1) hexString.append('0');
                hexString.append(hex);
            }

열심히 삽질중에 있습니다........ 혹여나 힌트라도 주시면 감사하겠습니다.


두분 답변 달아줘서 정말 감사합니다.

행복하소서

 


 

이 댓글 링크
다른 사이트에 공유하기

  • 0

결과 확인했습니다. 결국 델파이자체 해시한 값과 자바에서 구현한 값이 동일하게 확인됨니다.

험프리님 너무 감사합니다.  

자바 구현 도 상세히 설명해주시고 너무나 감사합니다.
아직 상대 서버를  api 접근 시도를 아직도 하고 있는 상황이라서  검증확인도 하지 못한 상황입니다.

답변 해주신 김원경님 그리고 c2design 님 너무 감사합니다...

행복한 하루 보내시길 바랍니다.

 

 

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 질문에 답변하기...

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.