コード例 #1
0
        public static byte[] decrypt(BFCText c, BFUserPrivateKey sk)
        {
            BFMasterPublicKey msk = sk.Param;
            Pairing           e   = msk.Pairing;

            //e(sQ,U), sQ is the user private key
            FieldElement temp = e.Compute(sk.Key, c.U);

            //sigma = V xor hash(temp)
            byte[] hash = BFUtil.HashToLength(temp.ToUByteArray(), c.V.Length); //This could fail

            byte[] sigma = BFUtil.XorTwoByteArrays(c.V, hash);

            hash = BFUtil.HashToLength(sigma, c.W.Length);

            byte[] m = BFUtil.XorTwoByteArrays(hash, c.W);

            //sigma||m
            byte[] toHash = new byte[sigma.Length + m.Length];
            Array.Copy(sigma, 0, toHash, 0, sigma.Length);
            Array.Copy(m, 0, toHash, sigma.Length, m.Length);

            //hash(sigma||m) to biginteger r;
            Field  field = e.Curve2.Field;
            BigInt r     = BFUtil.HashToField(toHash, field);

            if (c.U.Equals(e.Curve2.Multiply(msk.P, r)))
            {
                return(m);
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        public async Task <byte[]> DecipherMessage(string ct, SerializedPrivateKey sKey)
        {
            var decipherTask = Task <byte[]> .Factory.StartNew(() =>
            {
                BFUserPrivateKey key       = new BFUserPrivateKey(sKey);
                SerializedBFCText ciphered = (SerializedBFCText)JsonConvert.DeserializeObject(HttpUtility.UrlDecode(ct), typeof(SerializedBFCText));
                BFCText cText = new BFCText(ciphered);
                return(BFCipher.decrypt(cText, key));
            });

            await decipherTask;

            return((byte[])decipherTask.Result);
        }
コード例 #3
0
        public async Task <string> CipherMessage(byte[] message, string identity, SerializedPrivateKey sKey)
        {
            var cipherTask = Task <BFCText> .Factory.StartNew(() =>
            {
                BFUserPrivateKey key = new BFUserPrivateKey(sKey);
                BFUserPublicKey pKey = new BFUserPublicKey(identity, key.Param);
                return(BFCipher.encrypt(pKey, message, new Random()));
            });

            await   cipherTask;
            BFCText cipher = (BFCText)cipherTask.Result;

            return(HttpUtility.UrlEncode(JsonConvert.SerializeObject(cipher.Serialize())));
        }
コード例 #4
0
        public async Task <string> DecipherText(string ct, SerializedPrivateKey sKey)
        {
            var decipherTask = Task <byte[]> .Factory.StartNew(() =>
            {
                BFUserPrivateKey key       = new BFUserPrivateKey(sKey);
                SerializedBFCText ciphered = (SerializedBFCText)JsonConvert.DeserializeObject(ct, typeof(SerializedBFCText));
                BFCText cText = new BFCText(ciphered);
                return(BFCipher.decrypt(cText, key));
            });

            await decipherTask;

            byte[] bMessage = (byte[])decipherTask.Result;
            return(Encoding.UTF8.GetString(bMessage, 0, bMessage.Length));
        }
コード例 #5
0
        public void InitializePrivateKey()
        {
            SerializedPrivateKey sKey = new SerializedPrivateKey();

            sKey.KeyX              = "45042c22425461e759bab12d1d77626800f3a9f432944165a870fe3e9b8dea56023c19a7e0e512eb397b749c8d840625ab89e1ae2ec7d20ccefc3c50a3407269";
            sKey.KeyY              = "1c27658c204900d2073806f46d4fd9ce865ca5699c6d1b06866afee8c475fb930ecc6816fb8961f49383885ec5d61acf6e3c904a54caab238684547ab24bc79c";
            sKey.PairingCofactor   = "117454A4537B38AF9F9159D8EDBFB7E7C7C2E48760E930A461D5F451F9D9210DC70095F4B241FF57F1BB0549C";
            sKey.PairingGroupOrder = "8000000000000000000000000000000000020001";
            sKey.CurveField        = "8BA2A5229BD9C57CFC8ACEC76DFDBF3E3E1952C6B3193ECF5C571FB502FC5DF410F9267E9F2A605BB0F76F52A79E8043BF4AF0EF2E9FA78B0F1E2CDFC4E8549B";
            sKey.CurveA            = "1";
            sKey.CurveB            = "0";
            sKey.PX    = "51F135321C5575E297646AF71ED686E56C16CB32EE78E6DE5794139645D4A9107E9552BF33128FAF0ECAD1DD0A57E14BBAE1ECB1D1C08249011E7AA51AA300E7";
            sKey.PY    = "5A668356ACD310BCB60AD334E6F0D4BFFFEDD2BA2E2CE19743CE4C11DC739D8B660AAA69D37CB321BDFB8144D57C87C98800AF3AB82FBF5648A2AFF591B3E4C6";
            sKey.PPubX = "3F6B422DBF545B49D04CDFC08B5DF434129D6560D99D4C3F97165A6CB178DDBF9A3082BD03265E1CAE56539D83EA21365C448C14A1033D817B62BA2E6CC08713";
            sKey.PPubY = "6EF3DECFADA0CEF8F27CC8FF00A636E0DE4CB388802EAEC5A908FC7136D2F0A19CCDC667950BCE4F2278ACAB739F342D260FBA29FA9A0DA5B1F28E9793AD8B4D";
            key        = new BFUserPrivateKey(sKey);
            pKey       = new BFUserPublicKey("*****@*****.**", key.Param);
        }
コード例 #6
0
        public static KeyPair Extract(KeyPair masterKey, String ID, Random rnd)
        {
            //user public key is ID+ public parameters

            BFUserPublicKey pk = new BFUserPublicKey(ID, (BFMasterPublicKey)masterKey.Public);


            Pairing e = ((BFMasterPublicKey)masterKey.Public).Pairing;

            //user private key: hash(ID)->point Q
            //sQ, s is the master private key
            byte[] bid = null;
            bid = Encoding.UTF8.GetBytes(ID);

            Point  Q = BFUtil.HashToPoint(bid, e.Curve, e.Cofactor);
            BigInt s = ((BFMasterPrivateKey)masterKey.Private).Key;

            Q = e.Curve.Multiply(Q, s);

            BFUserPrivateKey sk = new BFUserPrivateKey(Q, (BFMasterPublicKey)masterKey.Public);

            return(new KeyPair(pk, sk));
        }