从C#到VB的RSACryptoServiceProvider转换

用户名

第三方客户端向我发送了以下代码块,以允许我访问其中的某些Web服务:

    RSACryptoServiceProvider rsaCryptoServiceProvider = new
    RSACryptoServiceProvider(dwKeySize);
    rsaCryptoServiceProvider.FromXmlString(xmlString);
    int keySize = dwKeySize / 8;
    byte[] bytes = Encoding.UTF32.GetBytes(inputString);
    int maxLength = keySize - 42;
    int dataLength = bytes.Length;
    int iterations = dataLength / maxLength;
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i <= iterations; i++)
   {
     byte[] tempBytes = new byte[(dataLength - maxLength * i > maxLength) ?
     maxLength : dataLength - maxLength * i];
     Buffer.BlockCopy(bytes, maxLength * i, tempBytes, 0, tempBytes.Length);
     byte[] encryptedBytes = rsaCryptoServiceProvider.Encrypt(tempBytes, true);
     Array.Reverse(encryptedBytes);
     stringBuilder.Append(Convert.ToBase64String(encryptedBytes));
    }
    return stringBuilder.ToString();

我已经将其从C#转换为VB.Net:

    Dim objEncrypter As New RSACryptoServiceProvider(Me.m_intKeySize)
    objEncrypter.FromXmlString(m_strEncryptionString)
    Dim intKeySize = Me.m_intKeySize / 8
    Dim objByte() As Byte = Encoding.UTF32.GetBytes(p_strXMLString.InnerXml)
    Dim intMaxLength As Integer = intKeySize - 42
    Dim intDataLength As Integer = objByte.Length
    Dim intIterations As Integer = intDataLength / intMaxLength
    Dim strResult As StringBuilder = New StringBuilder

    For intCounter As Integer = 0 To intIterations
        Dim tempBytes(IIf(intDataLength - intMaxLength * intCounter > intMaxLength, intMaxLength, intDataLength - intMaxLength * intCounter)) As Byte
        Buffer.BlockCopy(objByte, intMaxLength * intCounter, tempBytes, 0, tempBytes.Length)
        Dim objEncryptedBytes() As Byte = objEncrypter.Encrypt(tempBytes, True)
        Array.Reverse(objEncryptedBytes)
        strResult.Append(Convert.ToBase64String(objEncryptedBytes))
    Next

    Return strResult.ToString

问题在于它不断抛出以下异常:

System.ArgumentException:数组的偏移量和长度超出范围,或者count大于从索引到源集合末尾的元素数。

我可以看到它在做什么,尝试寻址不存在的字节数组区域,但是我看不到为什么。除非C#代码不起作用或翻译中有任何内容丢失。有什么建议么?

凯文

戴夫·多肯斯(Dave Doknjas)

VB数组是使用上限而非长度来声明的。因此使用:

Dim tempBytes(If(dataLength - maxLength * i > maxLength, maxLength, dataLength - maxLength * i) - 1) As Byte

此外,您应将VB整数除法用于以下用途:

Dim iterations As Integer = dataLength \ maxLength

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章