2015-02-04 2 views
0

아래 내가내가 Vb.Net에서 Copymem 해방 "의 Kernal32"별칭 "RtlMoveMemory에"를 기록하는 방식으로

지금 여기 vb.net에서 사용 어떻게 내 VB6 코드 LIB

Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 


Public Property Let Key(New_Value As String) 

    Dim i As Long 
    Dim j As Long 
    Dim K As Long 
    Dim dataX As Long 
    Dim datal As Long 
    Dim datar As Long 
    Dim Key() As Byte 
    Dim KeyLength As Long 

    'Do nothing if the key is buffered 
    If (m_KeyValue = New_Value) Then Exit Property 
    m_KeyValue = New_Value 

    'Convert the new key into a bytearray 
    KeyLength = Len(New_Value) 
    Key() = StrConv(New_Value, vbFromUnicode) 

    'Create key-dependant p-boxes 
    j = 0 
    For i = 0 To (ROUNDS + 1) 
    dataX = 0 
    For K = 0 To 3 
     Call CopyMem(ByVal VarPtr(dataX) + 1, dataX, 3) 'the problem is here 
     dataX = (dataX Or Key(j)) 
     j = j + 1 
     If (j >= KeyLength) Then j = 0 
    Next 
    m_pBox(i) = m_pBox(i) Xor dataX 
    Next 

End Property 

CopyMem 서브입니다 여기에 같은

Private Declare Sub CopyMem Lib "KERNEL32" Alias "RtlMoveMemory" (ByVal pDst As Object, ByVal pSrc As Object, ByVal ByteLen As Integer) 


Public WriteOnly Property Key() As String 
     Set(ByVal Value As String) 

      Dim i As Long 
      Dim j As Long 
      Dim K As Long 
      Dim dataX As Long 
      Dim datal As Long 
      Dim datar As Long 
      Dim Key() As Byte 
      Dim KeyLength As Long 

      'Do nothing if the key is buffered 
      If (m_KeyValue = Value) Then Exit Property 
      m_KeyValue = Value 

      'Convert the new key into a bytearray 
      KeyLength = Len(Value) 

      Key = System.Text.Encoding.Unicode.GetBytes(Value) 

      'Create key-dependant p-boxes 
      j = 0 

      For i = 0 To (ROUNDS + 1) 
       dataX = 0 
       For K = 0 To 3 


        CopyMem(VarPtr(dataX) + 1, dataX, 3) ' the problem is here 
        dataX = (dataX Or Key(j)) 
        j = j + 1 
        If (j >= KeyLength) Then j = 0 

       Next 
       m_pBox(i) = m_pBox(i) Xor dataX 
      Next 
End Property 

내 vb.net 코드는 VarPtr

Public Function VarPtr(ByVal e As Object) As Object 
     Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned) 
     Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32 
     GC.Free() 
     Return GC2 
    End Function 
에 대한 코드입니다

은 내가 Equivalent of CopyMemory in .NET

에 대해 참조했지만 여전히 나는이

하십시오 누군가의 도움을 받고 있지 않다!

+0

죄송합니다. 질문이 없습니다 ("작동하지 않는다"는 질문이 아닙니다). – Richard

+0

CopyMem (VarPtr (dataX) + 1, dataX, 3) '문제는 여기에 있습니다. 무한대로 연결되거나 아무런 오류가 없습니다. – Dandy

+0

* 질문에 * 입력하십시오. 추신. 'Array' 배열로'Array.Copy'의 문제점은 무엇입니까? 조달청. 당신은 자신의 암호 작성을 시도하는 것처럼 보입니다. "누구나 깨뜨릴 수없는 알고리즘을 쓸 수 있으며, 다른 사람들이 깨뜨릴 수 있는지 여부에 대해서는 아무 것도 말하지 않습니다." – Richard

답변

2

.NET에서 포인터를 사용하여 데이터에 액세스하려면 전체 작업 중에 고정 된 상태로 유지해야합니다. 메서드는 주소를 가져 오는 동안 개체를 고정하지만 개체를 ​​고정 해제합니다. 즉, CopyMem 호출을 수행하는 동안 개체를 이동할 수 있습니다. 대부분의 경우 객체가 이동되지 않으므로 잘 작동하는 것처럼 보일 수 있지만 이동하면 CopyMem 조작으로 인해 다른 데이터가 변경 될 수 있습니다. 이로 인해 응용 프로그램의 모든 객체가 이상하게 동작하거나 응용 프로그램이 중단 될 수 있습니다.

아무튼, 메모리 복사본을 사용하면 확실히 정수로 몇 비트를 이동하는 것에 지나치게 과장됩니다. (VB 6의 Long 데이터 유형 그런데 VB.NET에서 Integer 데이터 유형에 대응한다.)

바이트 배열로 정수 변환 할 수

, 그것은 다시 변환 후 Array.Copy 방법을 사용하고 :

Dim temp As Byte() = BitConverter.GetBytes(dataX) 
Array.Copy(temp, 0, temp, 1, 3) 
dataX = BitConverter.ToInt32(temp, 0) 

당신은 또한 사용 할 수있는 비트 연산 :

dataX = (dataX And &HFF) Or (dataX << 8) 

사이드 참고 : Encoding.Unicode는 UTF-16입니다 부호화. 즉, GetBytes이 반환하는 바이트 배열은 문자열 길이의 두 배가되므로 문자열의 절반 만 사용하게됩니다.

+0

작은 요청을 달성하기 위해 knw이 물건에 대한 begineer 오전 귀하의 코드 actully 무엇을 설명하고 또한 "사이드 노트" 명시된 pl. – Dandy

+2

@Dandy : 코드는 정수의 4 바이트 중 3 바이트를 1,2,3 위치에서 0,1,2 위치로 복사합니다. 비트 연산은 동일하게 유지되는 단일 바이트를 마스킹하여 3 바이트를 8 비트 (1 바이트) 이동시킨 것과 결합하여 동일하게 수행합니다. 인코딩과 관련하여, 예를 들어 문자열 "ABC"가 있다면, Encoding.Unicode.GetBytes 메소드는 배열'{65, 66, 67}'을 리턴하지 않을 것이고 배열'{65 , 0, 66, 0, 67, 0}'로 인코딩됩니다. – Guffa

+0

는 BitConverter를 수행합니다.GetBytes는 Encoding.Unicode.GetBytes와 동일한 작업을 수행합니다. BitConverter.GetBytes도 문자열의 길이가 두 배가됩니다. – Dandy