private byte[] littleEndianToBigEndian(Java.Math.BigInteger bigInt) { byte[] input = bigInt.ToByteArray(); if (input[0] == 0x00) { return(input.Skip(1).ToArray()); } return(input); }
private KeyPair rsaKeyFromBytes(byte [] keyBytes) { try { int offset = 0; int dataLen = 0; int version = 0; if (keyBytes.Length != 523 && keyBytes.Length != 2339) { offset += 1; // skip address version version = BitConverter.ToInt32(keyBytes, offset); offset += 4; } dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger modulus = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger exponent = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; RSAPrivateCrtKeySpec privKeySpec = null; if (keyBytes.Length > offset) { dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger P = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger Q = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger DP = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger DQ = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger InverseQ = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; dataLen = BitConverter.ToInt32(keyBytes, offset); offset += 4; Java.Math.BigInteger D = bigEndianToLittleEndian(keyBytes.Skip(offset).Take(dataLen).ToArray()); offset += dataLen; privKeySpec = new RSAPrivateCrtKeySpec(modulus, exponent, D, P, Q, DP, DQ, InverseQ); } RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(modulus, exponent); KeyFactory keyFactory = KeyFactory.GetInstance("RSA"); IPublicKey pubKey = keyFactory.GeneratePublic(pubKeySpec); IPrivateKey privKey = null; if (privKeySpec != null) { privKey = keyFactory.GeneratePrivate(privKeySpec); } return(new KeyPair(pubKey, privKey)); }catch (Exception) { Logging.warn("An exception occured while trying to reconstruct PKI from bytes"); } return(null); }