0

sagepay暗号化はVBでのみ文書化されているため、xor暗号化をC#で記述しようとしています。

vbコードは次のとおりです。

Public Shared Function simpleXor(ByVal strIn As String, ByVal strKey As String) As String
    Dim iInIndex As Integer
    Dim iKeyIndex As Integer
    Dim strReturn As String
    If Len(strIn) = 0 Or Len(strKey) = 0 Then
        simpleXor = ""
        Exit Function
    End If

    iInIndex = 1
    iKeyIndex = 1
    strReturn = ""

    '** Step through the plain text source XORing the character at each point with the next character in the key **
    '** Loop through the key characters as necessary **
    Do While iInIndex <= Len(strIn)
        strReturn = strReturn & Chr(Asc(Mid(strIn, iInIndex, 1)) Xor Asc(Mid(strKey, iKeyIndex, 1)))
        iInIndex = iInIndex + 1
        If iKeyIndex = Len(strKey) Then iKeyIndex = 0
        iKeyIndex = iKeyIndex + 1
    Loop

    simpleXor = strReturn
End Function

これまでのところ、これをに変換しました

        public static String SimpleXOR(String strIn, String strKey)
    {
        Int32 iInIndex, iKeyIndex;
        String strReturn;
        iInIndex = 1;
        iKeyIndex = 1;
        strReturn = "";

        while (iInIndex <= strIn.Length)
        {
            strReturn = strReturn & Strings.Chr(Strings.Asc(Strings.Mid(strIn, iInIndex, 1)) ^ Strings.Asc(Strings.Mid(strKey, iKeyIndex, 1)));
                iInIndex = iInIndex + 1;
            if (iKeyIndex == strKey.Length) iKeyIndex = 0;
            iKeyIndex = iKeyIndex + 1;

        }

    }

問題は、この行が何をしているのか理解できなかったことです

strReturn = strReturn & Chr(Asc(Mid(strIn, iInIndex, 1)) Xor Asc(Mid(strKey, iKeyIndex, 1)))

だから私はそれをvbからc#へのコンバーターで実行し、上記を取得しました。しかし、私が知る限り、それは明らかに有効なc#コードではありません。

誰か助けてもらえますか?

4

2 に答える 2

2

これを行うには、2つの方法が考えられます。

まず、スレッドの現在のSystem.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePageを取得し、GetEncodingメソッドを使用して新しいEncodingクラスインスタンスに渡し、次にEncodingインスタンスのGetBytesメソッドを使用して文字列をバイト配列に変換します

    public static string SimpleXOR(string strIn, string strKey)
    {
        if (strIn.Length == 0 || strKey.Length == 0)
        {
            return string.Empty;
        }

        int inIndex = 0;
        int keyIndex = 0;
        string returnString = string.Empty;

        var currentCodePage = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage;
        var encoding = Encoding.GetEncoding(currentCodePage);

        var inString = encoding.GetBytes(strIn);
        var keyString = encoding.GetBytes(strKey);

        while (inIndex < inString.Length)
        {
            returnString += (char)(inString[inIndex] ^ keyString[keyIndex]);

            inIndex++;

            if (keyIndex == keyString.Length - 1)
            {
                keyIndex = 0;
            }
            else
            {
                keyIndex++;
            }
        }

        return returnString;
    }

もう1つの簡単な方法は、C#プロジェクトにMicrosoft.VisualBasicへの参照を追加し、コンバーターで生成されたコードを実行させることです。Stringsクラスが使用可能になり、Strings.Chr、Strings.Asc、およびStrings.Midを実行できるようになります。

于 2012-12-03T17:40:24.300 に答える
0

C#では、それは単に

strReturn += (char)(strIn[iInIndex] ^strKey[iKeyIndex]);
于 2012-12-03T16:05:57.613 に答える