BouncyCastel Cast5 setkey - PullRequest
       10

BouncyCastel Cast5 setkey

0 голосов
/ 29 января 2012
using System;
using System.Linq;
using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Utilities.Encoders;

namespace Common.Encryption {

    public class Cast5Cryptographer {
        private bool forEncryption;
        private BufferedBlockCipher cipher;

        public Cast5Cryptographer(bool forEncryption) {
            this.forEncryption = forEncryption;
            cipher = new BufferedBlockCipher(new CfbBlockCipher(new Cast5Engine(), 64));
            cipher.Init(forEncryption, new ParametersWithIV(new KeyParameter(Encoding.ASCII.GetBytes("BC234xs45nme7HU9")), new byte[8]));
        }

        public void ReInit(byte[] IV, BigInteger pubkey) {
            cipher.Init(forEncryption, new ParametersWithIV(new KeyParameter(pubkey.ToByteArrayUnsigned()), IV));
        }

        public int BlockSize {
            get {
                return cipher.GetBlockSize();
            }
        }

        public byte[] DoFinal() {
            return cipher.DoFinal();
        }

        public byte[] DoFinal(byte[] buffer) {
            return cipher.DoFinal(buffer);
        }

        public byte[] DoFinal(byte[] buffer, int startIndex, int len) {
            return cipher.DoFinal(buffer, startIndex, len);
        }

        public byte[] ProcessBytes(byte[] buffer) {
            return cipher.ProcessBytes(buffer);
        }

        public byte[] ProcessBytes(byte[] buffer, int startIndex, int len) {
            return cipher.ProcessBytes(buffer, startIndex, len);
        }
    }
}

работает нормально с ключом, длина которого выше 16, но когда я пытаюсь ReInit() его с этим ключом byte[] newkey = new byte[] { 0x39, 0x65, 0x38, 0x63, 0x64, 0x32, 0x36, 0x63, 0x37, 0x37, 0x34, 0x31, 0x33, 0x65, 0x61, 0x36, 0x65, 0x35, 0x35, 0x39, 0x61, 0x32, 0x35, 0x32, 0x66, 0x30, 0x31, 0x35, 0x32, 0x38, 0x66, 0x39, 0x34, 0x38, 0x66, 0x33, 0x33, 0x34, 0x32, 0x62, 0x31, 0x38, 0x37, 0x36, 0x34, 0x61, 0x66, 0x35, 0x36, 0x38, 0x62, 0x39, 0x63, 0x39, 0x30, 0x33, 0x63, 0x35, 0x38, 0x38, 0x35, 0x34, 0x65, 0x63 };

, оно выдает это исключение Index was outside the bounds of the array.

for (int i = 0; i < key.Length; i++) { x[i] = (int)(key[i] & 0xff); }

внутри метода SetKey в Cast5Engine.cs, поэтому я обновил этот метод, чтобы вместо фиксированной длины равной x, равной 16, я сделал ее

int[] x = new int[key.Length]; for (int i = 0; i < 16; i++) x[i] = 0;

        /* copy the key into x */
        for (int i = 0; i < key.Length; i++) {
            x[i] = (int)(key[i] & 0xff);
        }`

, но теперь, сравнивая результат, полученный с Cast5 из BouncyCastel с Cast5 из OpenSSL, кажется, что Bouncycastel Cast5 не обновляетсяправильный ключ, поэтому он производит неправильное шифрование / дешифрование.

Есть ли какие-либо предложения по исправлению метода Setkey?

1 Ответ

0 голосов
/ 17 апреля 2012

Посмотрев на исходный код метода CAST_setKey OpenSSL ...

    void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data)
#ifdef OPENSSL_FIPS
    {
    fips_cipher_abort(CAST);
    private_CAST_set_key(key, len, data);
    }
void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data)
#endif
    {
    CAST_LONG x[16];
    CAST_LONG z[16];
    CAST_LONG k[32];
    CAST_LONG X[4],Z[4];
    CAST_LONG l,*K;
    int i;

    for (i=0; i<16; i++) x[i]=0;
    if (len > 16) len=16;

См. Строку "if (len> 16) len = 16;", они сохраняют только первые 16 байтовключ.Это не случилось бы для Conquer Online 2.0, не так ли? Я узнаю "BC234xs45nme7HU9".

...