Question

J'ai besoin de chiffrer une chaîne de texte dans une application .NET à l'aide d'une touche texte connue, puis de le déchiffrer en rubis en utilisant la même clé connue ... Cependant, j'ai du mal à faire cela arriver.Je pense que cela a à voir avec des problèmes de codage de chaîne.Les exemples de Ruby RC4 se sont révélés insaisissables.

Je reçois et je reçois un déchiffrement invalide sur le côté rubis.Le cryptage / décryptage fonctionne correctement sur la mise en œuvre .NET.Mais lorsque je copie la valeur cryptée sur la mise en œuvre de rubis et utilisez la même clé, je n'ai pas mon valeur d'origine.

ci-dessous est ma mise en œuvre de RC4 .NET RC4 (cela ne nécessite pas le plus haut niveau de sécurité, mais certains sont bien) :)

sur le côté rubis, j'utilise ruby-rc4 https://github.com/case/Ruby-Rc4

       public string keytext = "thisismykey";
    public Form1()
    {
        InitializeComponent();
    }
    public void RC4(ref Byte[] bytes, Byte[] key)
    {

        Byte[] s = new Byte[256];
        Byte[] k = new Byte[256];
        Byte temp;
        int i, j;

        for (i = 0; i < 256; i++)
        {
            s[i] = (Byte)i;
            k[i] = key[i % key.GetLength(0)];
        }

        j = 0;
        for (i = 0; i < 256; i++)
        {
            j = (j + s[i] + k[i]) % 256;
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
        }

        i = j = 0;
        for (int x = 0; x < bytes.GetLength(0); x++)
        {
            i = (i + 1) % 256;
            j = (j + s[i]) % 256;
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            int t = (s[i] + s[j]) % 256;
            bytes[x] ^= s[t];
        }
    }
    static byte[] GetBytes(string str)
    {
        Byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }
    static string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Byte[] content = Encoding.ASCII.GetBytes(textBox1.Text);
        RC4(ref content, Encoding.ASCII.GetBytes(keytext));
        textBox2.Text = Encoding.ASCII.GetString(content);
        RC4(ref content, Encoding.ASCII.GetBytes(keytext));
        label1.Text = Encoding.ASCII.GetString(content);
    }

Était-ce utile?

La solution

Le problème est probablement survenu car l'encodage ASCII est de 7 bits et a du mal à recréer des caractères pour les valeurs supérieures à 127. Essayez de coder avec UTF-8 ou de convertir le tableau d'octets en une chaîne de base64.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top