Beispiel #1
0
        public static Rsa Inject(BigInteger e, int keyLen, int certainty, byte[] publicKey)
        {
            byte[] privateData           = new byte[MontgomeryCurve25519.PrivateKeySizeInBytes];
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            // Генерируем секретное значение для инициализации ГПСЧ
            rng.GetBytes(privateData);

            // Создаём полезную нагрузку, шифруя seed
            byte[] payload = MontgomeryCurve25519.GetPublicKey(privateData);
            byte[] seed    = MontgomeryCurve25519.KeyExchange(publicKey, privateData);

            Rsa rsa = new Rsa(e, keyLen, certainty, new Random(seed.PackToInt()));

            Rsa.RsaParams rsap = rsa.Params;

            // Вшиваем полезную нагрузку в модуль n
            byte[] mod = rsap.n.ToByteArray();
            Replace(mod, payload, 80);
            BigInteger n = new BigInteger(mod);

            // q = NextPrime(n' / p)
            rsap.q = (n.Divide(rsap.p)).NextProbablePrime();

            if (rsap.p.CompareTo(rsap.q) < 0)   // Если q больше p, меняем их местами
            {
                BigInteger tmp = rsap.p;
                rsap.p = rsap.q;
                rsap.q = tmp;
            }

            // Заново считаем остальные параметры
            rsa.GenerateKeys(rsap.p, rsap.q);
            return(rsa);
        }
Beispiel #2
0
        public static Rsa Extract(BigInteger e, BigInteger mod, int certainty, byte[] privateKey)
        {
            byte[] modulus = mod.ToByteArray();
            byte[] payload = new byte[MontgomeryCurve25519.PublicKeySizeInBytes];

            // Вытаскиваем полезную нагрузку и расшифровываем seed
            Array.Copy(modulus, 80, payload, 0, 32);
            byte[] seed = MontgomeryCurve25519.KeyExchange(payload, privateKey);

            Rsa rsa = new Rsa(e, mod.BitLength, certainty, new Random(seed.PackToInt()));

            Rsa.RsaParams rsap = rsa.Params;

            // Вшиваем полезную нагрузку в модуль n
            modulus = rsap.n.ToByteArray();
            Replace(modulus, payload, 80);
            BigInteger n = new BigInteger(modulus);

            // q = NextPrime(n' / p)
            rsap.q = (n.Divide(rsap.p)).NextProbablePrime();

            if (rsap.p.CompareTo(rsap.q) < 0)   // Если q больше p, меняем их местами
            {
                BigInteger tmp = rsap.p;
                rsap.p = rsap.q;
                rsap.q = tmp;
            }

            // Заново считаем остальные параметры
            rsa.GenerateKeys(rsap.p, rsap.q);
            return(rsa);
        }