Beispiel #1
0
        public Boolean Run()
        {
            Console.WriteLine($"RSA performance test :");
            Console.WriteLine($"1. 建立金鑰: AB雙方各自產生一組成對的(公鑰及私鑰).");
            string sContainer_A = "A";
            string sContainer_B = "B";

            if (!ZRSA.CreateContainer(sContainer_A))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            if (!ZRSA.CreateContainer(sContainer_B))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"{sContainer_A} = {ZRSA.ExistingContainer(sContainer_A)}, {ZRSA.GetContainerFileFullName(sContainer_A)}");
            Console.WriteLine($"{sContainer_B} = {ZRSA.ExistingContainer(sContainer_B)}, {ZRSA.GetContainerFileFullName(sContainer_B)}");
            Console.WriteLine();

            Console.WriteLine($"2. 取得公鑰: A取得(B的公鑰), 並確保(B的公鑰)是來自於B.");
            string sPublicKeyXML_B = ZRSA.GetPublicKey(sContainer_B);

            if (string.IsNullOrEmpty(sPublicKeyXML_B))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"(B的公鑰) = {sPublicKeyXML_B.Length}, {sPublicKeyXML_B}");
            Console.WriteLine();

            Console.WriteLine($"3. 加密原文: A利用(B的公鑰), 加密(原文)後, 產生(加密訊息).");
            string sPlainText;

            byte[] baPlainText;
            byte[] baEncrypt;
            string sPrivateKeyXML_A = ZRSA.GetPrivateKey(sContainer_A);

            byte[] baSignatureUTF8;
            string sPublicKeyXML_A  = ZRSA.GetPublicKey(sContainer_A);
            string sPrivateKeyXML_B = ZRSA.GetPrivateKey(sContainer_B);

            byte[] baDecrypt;

            int       iTestCount      = 300;
            Stopwatch swEncryptRSA    = new Stopwatch();
            Stopwatch swDecryptRSA    = new Stopwatch();
            Stopwatch swSignRSA       = new Stopwatch();
            Stopwatch swVerifySignRSA = new Stopwatch();

            for (int i = 0; i < iTestCount; i++)
            {
                swEncryptRSA.Start();
                sPlainText  = new string('H', i + 1);
                baPlainText = ZByte.GetBytesUTF8(sPlainText);

                // 原文長度最多 117 bytes.
                baEncrypt = ZRSA.Encrypt(baPlainText, sPublicKeyXML_B);
                if (baEncrypt == null)
                {
                    Console.WriteLine("Encrypt " + ZRSA.msError);
                    break;
                }
                swEncryptRSA.Stop();

                swSignRSA.Start();
                baSignatureUTF8 = ZRSA.SignDataSHA1(baPlainText, sPrivateKeyXML_A);
                if (baSignatureUTF8 == null)
                {
                    Console.WriteLine("Sign " + ZRSA.msError);
                    break;
                }
                swSignRSA.Stop();

                swDecryptRSA.Start();
                baDecrypt = ZRSA.Decrypt(baEncrypt, sPrivateKeyXML_B);
                if (baDecrypt == null)
                {
                    Console.WriteLine("Decrypt " + ZRSA.msError);
                    break;
                }
                swDecryptRSA.Stop();

                swVerifySignRSA.Start();
                //Console.WriteLine($"驗證簽章 = {ZRSA.VerifyDataSHA1(baDecrypt, sPublicKeyXML_A, baSignatureUTF8)}.");
                if (!ZRSA.VerifyDataSHA1(baDecrypt, sPublicKeyXML_A, baSignatureUTF8))
                {
                    Console.WriteLine("Verify " + ZRSA.msError);
                    return(false);
                }
                swVerifySignRSA.Stop();

                Console.WriteLine("{0}, Encrypt={1}, Sign={2}, Decrypt={3}, Verify={4}, EncryptLen={5}, DecryptLen={6}.",
                                  i + 1,
                                  swEncryptRSA.ElapsedMilliseconds,
                                  swDecryptRSA.ElapsedMilliseconds,
                                  swSignRSA.ElapsedMilliseconds,
                                  swVerifySignRSA.ElapsedMilliseconds,
                                  baEncrypt.Length,
                                  baDecrypt.Length);

                /*
                 *
                 * 1, Encrypt=1, Sign=6, Decrypt=9, Verify=0, EncryptLen=128, DecryptLen=1.
                 * 2, Encrypt=1, Sign=11, Decrypt=14, Verify=0, EncryptLen=128, DecryptLen=2.
                 * 3, Encrypt=1, Sign=15, Decrypt=17, Verify=1, EncryptLen=128, DecryptLen=3.
                 * 4, Encrypt=1, Sign=22, Decrypt=22, Verify=1, EncryptLen=128, DecryptLen=4.
                 * 5, Encrypt=1, Sign=28, Decrypt=25, Verify=1, EncryptLen=128, DecryptLen=5.
                 * 6, Encrypt=2, Sign=31, Decrypt=30, Verify=1, EncryptLen=128, DecryptLen=6.
                 * 7, Encrypt=2, Sign=36, Decrypt=34, Verify=2, EncryptLen=128, DecryptLen=7.
                 * 8, Encrypt=2, Sign=41, Decrypt=41, Verify=2, EncryptLen=128, DecryptLen=8.
                 * 9, Encrypt=2, Sign=46, Decrypt=46, Verify=2, EncryptLen=128, DecryptLen=9.
                 * 10, Encrypt=3, Sign=51, Decrypt=54, Verify=2, EncryptLen=128, DecryptLen=10.
                 * 20, Encrypt=6, Sign=106, Decrypt=115, Verify=5, EncryptLen=128, DecryptLen=20.
                 * 30, Encrypt=10, Sign=155, Decrypt=180, Verify=8, EncryptLen=128, DecryptLen=30.
                 * 40, Encrypt=29, Sign=206, Decrypt=260, Verify=11, EncryptLen=128, DecryptLen=40.
                 * 50, Encrypt=33, Sign=249, Decrypt=323, Verify=15, EncryptLen=128, DecryptLen=50.
                 * 60, Encrypt=37, Sign=298, Decrypt=394, Verify=18, EncryptLen=128, DecryptLen=60.
                 * 70, Encrypt=43, Sign=353, Decrypt=474, Verify=22, EncryptLen=128, DecryptLen=70.
                 * 80, Encrypt=47, Sign=411, Decrypt=557, Verify=26, EncryptLen=128, DecryptLen=80.
                 * 90, Encrypt=54, Sign=456, Decrypt=619, Verify=28, EncryptLen=128, DecryptLen=90.
                 * 100, Encrypt=57, Sign=495, Decrypt=669, Verify=30, EncryptLen=128, DecryptLen=100.
                 * 117, Encrypt=62, Sign=571, Decrypt=762, Verify=34, EncryptLen=128, DecryptLen=117.
                 * Encrypt 長度錯誤。
                 *
                 */
            }

            return(true);
        }
        public Boolean Run()
        {
            Console.WriteLine($"RSA 測試:");
            Console.WriteLine($"1. 建立金鑰: AB雙方各自產生一組成對的(公鑰及私鑰).");
            string sContainer_A = "A";
            string sContainer_B = "B";

            if (!ZRSA.CreateContainer(sContainer_A))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            if (!ZRSA.CreateContainer(sContainer_B))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"{sContainer_A} = {ZRSA.ExistingContainer(sContainer_A)}, {ZRSA.GetContainerFileFullName(sContainer_A)}");
            Console.WriteLine($"{sContainer_B} = {ZRSA.ExistingContainer(sContainer_B)}, {ZRSA.GetContainerFileFullName(sContainer_B)}");
            Console.WriteLine();

            Console.WriteLine($"2. 取得公鑰: A取得(B的公鑰), 並確保(B的公鑰)是來自於B.");
            string sPublicKeyXML_B = ZRSA.GetPublicKey(sContainer_B);

            if (string.IsNullOrEmpty(sPublicKeyXML_B))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"(B的公鑰) = {sPublicKeyXML_B.Length}, {sPublicKeyXML_B}");
            Console.WriteLine();

            Console.WriteLine($"3. 加密原文: A利用(B的公鑰), 加密(原文)後, 產生(加密訊息).");
            string sPlainTextSalt = DateTime.Now.ToString("yyyyMMddHHmmssfff");
            string sPlainText     = "123, 到台灣, 台灣有個阿里山. ~!@#$%^&*()<>{}[]:;\"'*%!#\\/ABCD." + sPlainTextSalt;

            byte[] baPlainText = ZByte.GetBytesUTF8(sPlainText);
            byte[] baEncrypt   = ZRSA.Encrypt(baPlainText, sPublicKeyXML_B);
            if (baEncrypt == null)
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"原文: {baPlainText.Length}, {sPlainText}");
            Console.WriteLine($"密文: {baEncrypt.Length}, {baEncrypt.ZGetStringHex()}");
            Console.WriteLine();

            Console.WriteLine($"4. 製作簽章: A利用(A的私鑰), 簽章(原文)後, 產生(簽章訊息).");
            string sPrivateKeyXML_A = ZRSA.GetPrivateKey(sContainer_A);

            byte[] baSignatureUTF8 = ZRSA.SignDataSHA1(baPlainText, sPrivateKeyXML_A);
            if (baSignatureUTF8 == null)
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"簽章: {baSignatureUTF8.Length}, {baSignatureUTF8.ZGetStringHex()}");
            Console.WriteLine();

            Console.WriteLine($"5. 傳送訊息: B取得(A的公鑰), (加密訊息), (簽章訊息).");
            string sPublicKeyXML_A = ZRSA.GetPublicKey(sContainer_A);

            if (string.IsNullOrEmpty(sPublicKeyXML_A))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"(A的公鑰) = {sPublicKeyXML_A.Length}, {sPublicKeyXML_A}");
            Console.WriteLine();

            Console.WriteLine($"6. 解密訊息: B利用(B的私鑰), 解密(加密訊息), 取得(原文).");
            string sPrivateKeyXML_B = ZRSA.GetPrivateKey(sContainer_B);

            if (string.IsNullOrEmpty(sPrivateKeyXML_B))
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            Console.WriteLine($"(B的私鑰) = {sPrivateKeyXML_B.Length}, {sPrivateKeyXML_B}");

            byte[] baDecrypt = ZRSA.Decrypt(baEncrypt, sPrivateKeyXML_B);
            if (baDecrypt == null)
            {
                Console.WriteLine(ZRSA.msError);
                return(false);
            }
            string sDecrypt = baDecrypt.ZGetStringUTF8();

            Console.WriteLine($"解密訊息 = {baDecrypt.Length}, {sDecrypt}");
            Console.WriteLine($"解密結果 = {sDecrypt == sPlainText}.");
            Console.WriteLine();

            Console.WriteLine($"7. 驗證簽章: B取得(A的公鑰), 驗證(簽章訊息), 確定(加密訊息)沒有被竄改..");
            Console.WriteLine($"驗證簽章 = {ZRSA.VerifyDataSHA1(baDecrypt, sPublicKeyXML_A, baSignatureUTF8)}.");
            Console.WriteLine();

            Console.WriteLine($"刪除金鑰: 刪除存放在本機的金鑰.");
            if (ZRSA.DeleteContainer(sContainer_A))
            {
                Console.WriteLine("刪除A");
            }
            if (ZRSA.DeleteContainer(sContainer_B))
            {
                Console.WriteLine("刪除B");
            }

            Console.WriteLine("實際刪除金鑰是由 garbage collection 執行, 不會立刻刪除.");
            Console.WriteLine($"{sContainer_A} = {ZRSA.ExistingContainer(sContainer_A)}, {ZRSA.GetContainerFileFullName(sContainer_A)}");
            Console.WriteLine($"{sContainer_B} = {ZRSA.ExistingContainer(sContainer_B)}, {ZRSA.GetContainerFileFullName(sContainer_B)}");
            Console.WriteLine();
            return(true);
        }