2010-08-22 1 views
2

누구든지이 알고리즘을 역전하는 방법을 쉽게 설명하여 원본 텍스트 문자열을 다시 얻을 수 있습니까?원본 텍스트를 되찾기 위해이 알고리즘을 취소하는 방법은 무엇입니까?

Public Function CreateIntChecksum(ByVal s As String) As Integer 
    Dim r As Integer = 0 
    For i As Integer = 0 To (s.Length() - 1) 
     Dim bchar As Byte = Convert.ToByte(s(i)) 
     r = bchar + ((r << 5) - r) 
    Next 
    Return r 
End Function 
+5

두 단어 : 나는 가능합니다. 해시 또는 체크섬 기능이 무엇인지 그리고 그 용도를 찾아야합니다. 어쨌든'Integer' 값보다'String' 값이 더 많으므로 역 매핑이 불가능합니다. –

+8

@Charles Bailey 두 단어? – Stephen

+1

고의적 인 금권 주의자 : http://en.wikipedia.org/wiki/Samuel_Goldwyn –

답변

1

단순히 되돌릴 수 없습니다. 그것은 되돌릴 수없는 체크섬입니다.

2

어떻게이 알고리즘을 바꾸어 원래의 텍스트 문자열로 되돌릴 수 있습니까?

의도적으로 설계 할 수 없습니다.
이것은 (간단한) 체크섬 또는 해시 기능입니다.

들어가고 나가는 정보의 크기를 살펴보십시오.이 함수는 임의의 길이의 문자열 s을 32 비트 정수로 변환합니다. 각 정수 값에 대해 그 결과를 산출 할 많은 입력 문자열이 있습니다.


편집 : 분명히 셔플 알고리즘이 필요합니다. 어쩌면 ROT13을 살펴보십시오. 이것은 (매우) 안전한 형태의 암호화가 아니라는 점을 알려줍니다.

+0

또한 C#에서 수식 기반 셔플 알고리즘이 필요합니다. 이 코드를 발견했을 때 인터넷을 검색하고있었습니다. 누구든지 백 워드 기능을 사용하는 수식 기반의 셔플 링을 사용하면 단일 텍스트를 수백 번 섞어도 되돌릴 수 있습니다. – Tush

2

수 없습니다. 여기에있는 것은 체크섬입니다.이 체크섬은 기본적인 해시 함수입니다. 해시 함수의 전체 포인트은 되돌릴 수 없다는 것입니다. 해싱 함수는 일련의 입력 (일반적으로 무한)을 작은 출력 집합에 매핑하므로 여러 입력이 동일한 출력으로 끝날 수 있으므로 해시가 올바르게 완료되었다고 가정하면 해시를 되돌릴 수 없습니다. 이것이 암호를 저장하는 데 사용되는 이유입니다. 해시를 읽고 "아, 암호 XYZ"로 이동하는 방법은 없습니다.

편도 을 시도하면 무지개 표를 사용하는 것이 좋습니다. 이것은 입력 값과 그에 상응하는 해시 값 (또는이 경우 체크섬 된 값)의 대용량 테이블 일뿐입니다. 알 수없는 문자열의 해쉬 된 값을 가지고 있다면 테이블에서 검색하여 집합을 얻을 수 있습니다. 입력. 이것은 불가능한 해시 함수를 뒤집을 수있는 방법이 아닙니다. 단지 짐승 같은 추측 방법 일뿐입니다. 이 경우 (해시 함수가 바이어스되어 있지 않다고 가정), 비주얼 베이직 string은 임의의 길이가 될 수 있으므로 각 체크섬 값과 일치하는 무한 수의 문자열이 있습니다. 이것은 무지개 테이블을 매우 비실용적으로 만들 것입니다 - 해싱을위한 입력 값 집합을 커버 할 수 있습니다 (대부분의 일반 사용자는 10 문자 코드를 입력하지 않으므로)하지만 67 문자 코드를 사용하여 사용자를 멈추게하는 것은 없습니다. 또는 109 또는 ...

Hash Functions, ChecksumsRainbow Tables에 대한 위키 백과 문서를 참조하십시오.

+0

+1 그러나 레인보우 테이블을 사용하면 해시를 읽고 "문자열 XYZ가이 값에 해시를 적용하므로 무한히 많은 다른 문자열도 가능합니다"라고 말할 수 있습니다. RT는 기본적으로 무차별 한 솔루션입니다. – Piskvor

+0

이것은 해시 기능이 아닙니다. 나는 반전이 가능한지 알아 내기 위해 그것을 집어 들었다. 이것은이 알고리즘을 통해 정수를 출력하는 비트 단위의 인코딩 함수입니다. 되돌릴 수 있을까요? – Tush

+0

@Pisk :하지만 그 문자열은 충돌 문자열 만 가져올 것입니다. 암호가 필요하다면 확인을 클릭하십시오. 그러나 무지개 표를 사용하면 원본 텍스트를 줄 가능성은 거의 없습니다. –

0

수 없습니다. 그 외의 경우에는 Integer에 32 비트의 데이터 만 있고 String에는 길이가있을 수 있기 때문에 간단합니다.

+0

64 비트 정수를 사용하면 되돌릴 때 고정 길이의 문자열을 다시 가져올 수 있습니까? – Tush

+1

@Tush no. 불행히도. 가역 암호화 란 무엇입니까? – Wes

+0

예. 나는 수학을 배우고 약하다. 내가 고정 문자열 길이 = 고정 가역 암호화 알고리즘을 갖고 싶어. – Tush

4

원본 텍스트를 찾을 수 없지만 쉽게 사전 이미지를 찾을 수 있습니다. 중요한 점은

r = bchar + r*31 

따라서, 해시가베이스 (31)에 문자열을 인코딩 동등

r = bchar + ((r << 5) - r) 

이다. 프리 이미지를 찾으려면 정수를 기본 31로 다시 작성하면됩니다.결과가 3456 인 경우

는 예를 들어, 우리는 하나의 가능한 정도로 원래의 텍스트 "\x03\x12\x0f"이고, 31 = 3 × 2 × + 18 31 + 15 3456 알고있다. 물론 숫자를 다시 배열하여 11× 31 + 46 ("n.") 또는 109 × 31+77 ("mM") 등의 고유 한 사전 이미지가 없음을 알 수 있습니다.

+0

누군가가 간단한 reversible 알고리즘을 가지고 있다면? – Tush

+0

나는이 코드에 완전히 익숙하지 않다. 코딩 해주세요. – Tush

+0

정말이 답변을 좋아합니다. 굉장한 +1. – mrduclaw

0

우선 게시 된 코드는 문자열 중 가장 짧은 문자열에 대한 예외를 throw합니다.

다음 코드에는 OP의 원래 코드와 간단한 체크섬 및 체크섬 사용 방법이 나와 있습니다.

Private Sub Button2_Click(ByVal sender As System.Object, _ 
          ByVal e As System.EventArgs) Handles Button2.Click 

    Dim buffer() As Byte 

    Dim tstString As String = "Calculate a checksum for a given string" 

    Dim chkSumFix As Integer = CreateIntChecksumFixed(tstString) 'get a checksum 

    buffer = SendPacket(tstString, chkSumFix) 'create a byte buffer to send 
    tstString = decodePacket(buffer) 

    'do the same using the OP's original code 
    Dim chkSum As Integer = CreateIntChecksum(tstString) 'error 

    buffer = SendPacket(tstString, chkSum) 
End Sub 

'OP 
Public Function CreateIntChecksum(ByVal s As String) As Integer 
    Dim r As Integer = 0 
    For i As Integer = 0 To (s.Length() - 1) 
     Dim bchar As Byte = Convert.ToByte(s(i)) 
     r = bchar + ((r << 5) - r) 
    Next 
    Return r 
End Function 

'a very simple checksum 
Public Function CreateIntChecksumFixed(ByVal s As String) As Integer 
    Dim r As Integer = 0 
    For i As Integer = 0 To (s.Length() - 1) 
     Dim bchar As Byte = Convert.ToByte(s(i)) 
     r = (r And &HFFFF) + bchar 
    Next 
    Return r 
End Function 

Private Function SendPacket(ByVal aString As String, _ 
          ByVal aChecksum As Integer) As Byte() 
    'construct a packet to be sent 
    'Packet format 
    'returns a byte buffer 
    'byte(0 -3) = length of original string - use BitConverter.ToInt32 to extract 
    'byte(4-n) = original string. n = (4 + string length) - 1 
    'byte(n + 1, n + 2, n + 3, n + 4) = checksum 

    Dim length As Integer 
    Dim retV As New List(Of Byte) 
    retV.AddRange(System.Text.Encoding.ASCII.GetBytes(aString)) 'add string to packet 
    length = retV.Count 'get length - use this length in case a different encoding is used 
    retV.AddRange(BitConverter.GetBytes(aChecksum)) 'add checksum 
    retV.InsertRange(0, BitConverter.GetBytes(length)) 'insert length at start of packet 

    Return retV.ToArray 
End Function 

Private Function decodePacket(ByVal buffer As Byte()) As String 
    Dim sLen As Integer = BitConverter.ToInt32(buffer, 0) 
    If sLen + 8 <> buffer.Length Then Throw New ArgumentOutOfRangeException 

    Dim s As String = System.Text.Encoding.ASCII.GetChars(buffer, 4, sLen) 

    Dim chksum As Integer = CreateIntChecksumFixed(s) 

    Dim embeddedChecksum As Integer = BitConverter.ToInt32(buffer, sLen + 4) 

    If chksum <> embeddedChecksum Then Throw New ArgumentException("Invalid checksum") 
    Return s 
End Function 
+0

사실 왜 간단한 진술만으로 투표 할 자격이됩니까? – dbasnett

+0

이것은 새로운 생각으로 연결됩니다. 문자열이 충분히 짧으면 실제로 되돌릴 수 있습니다. :-) 왜 예외를 throw해야하는지 잘 모르겠다 - 오버플로가 vb.net에서 예외를 생성합니까? – Eiko

+0

지적했듯이이 코드는 체크섬 (함수 이름, 코드)을 생성하는 데 사용되는 것으로 보입니다. 나는 코드와 의도 된 목적 (추측)으로 나의 포스트를 편집 할 것이다. – dbasnett

관련 문제