{"id":13748443,"url":"https://github.com/KuroChan1998/Mathematical-Caculation-Tools","last_synced_at":"2025-05-09T10:32:40.103Z","repository":{"id":216841850,"uuid":"178654816","full_name":"KuroChan1998/Mathematical-Caculation-Tools","owner":"KuroChan1998","description":"A tools for mathematical caculation such as greatest common factor, primitive roots, primality test .etc","archived":false,"fork":false,"pushed_at":"2020-07-26T09:16:31.000Z","size":3794,"stargazers_count":6,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-05-22T19:31:56.159Z","etag":null,"topics":["goldwasser-micali","informationsecurity","java","mathematica","paillier","prime-numbers","rsa"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KuroChan1998.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2019-03-31T07:11:31.000Z","updated_at":"2023-12-27T07:41:20.000Z","dependencies_parsed_at":null,"dependency_job_id":"ef633cbc-755c-49cf-af4f-4566234f221c","html_url":"https://github.com/KuroChan1998/Mathematical-Caculation-Tools","commit_stats":null,"previous_names":["kurochan1998/mathematical-caculation-tools"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KuroChan1998%2FMathematical-Caculation-Tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KuroChan1998%2FMathematical-Caculation-Tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KuroChan1998%2FMathematical-Caculation-Tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KuroChan1998%2FMathematical-Caculation-Tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KuroChan1998","download_url":"https://codeload.github.com/KuroChan1998/Mathematical-Caculation-Tools/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253234179,"owners_count":21875562,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["goldwasser-micali","informationsecurity","java","mathematica","paillier","prime-numbers","rsa"],"created_at":"2024-08-03T07:00:41.839Z","updated_at":"2025-05-09T10:32:35.092Z","avatar_url":"https://github.com/KuroChan1998.png","language":"Java","funding_links":[],"categories":["资源清单"],"sub_categories":["Mathematic Fundamentals of Information Security I"],"readme":"# Mathematical-Calculation-Tools\r\n\r\n项目更新优化于github，同学下载源码请前往：[https://github.com/KuroChan1998/Mathematical-Caculation-Tools](https://github.com/KuroChan1998/Mathematical-Caculation-Tools)\r\n\r\n* `Mathematical-Calculation-Tools`是一个数值计算工具，功能包括整数域的运算(e.g 贝祖等式求解、勒让得符号、原根、素性检验....）；多项式的运算（e.g 贝祖等式求解、不可约多项式、本原多项式判断....)；加密算法（e.g. RSA)；椭圆曲线上的计算。\r\n* 面向人群主要是上海交通大学信息安全专业修读《信息安全数学基础》课程的学生；其他网安专业学习数学理论基础的学生；抽象代数、应用数学领域学习的学生。\r\n* 含图形界面\r\n* 提供jar包，可作为api引用或在装有jre环境的机器上直接运行 \r\n* 这里酷乐酱用原生java实现，没有使用任何第三方api，算法原理全部参考陈恭亮老师编著的《信息安全数学基础》教材以及wiki，开源以供大家学习。\r\n\r\n\r\n\r\n## 快速上手\r\n\r\n### 使用jar包\r\n\r\n在装有jre（\u003e1.5）的机器上直接双击`Mathematical-Caculation-Tools-1.0-SNAPSHOT-jar-with-dependencies.jar`可以直接得到图形界面\r\n\r\n### 使用开发工具建立项目并运行\r\n\r\n如果您装有jdk，以及idea、eclipse等开发环境和开发工具，直接导入该maven项目，找到com.jzy.app.Main.java文件直接运行。\r\n\r\n![Snipaste_2019-08-28_13-23-40](screenshot/Snipaste_2019-08-28_13-23-40.jpg)\r\n\r\n#### My environment\r\n\r\n* *java*\r\n\r\n  java version \"1.8.0_211\"\r\n  Java(TM) SE Runtime Environment (build 1.8.0_211-b12)\r\n  Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)\r\n\r\n* *IDE*\r\n\r\n  IntelliJ IDEA 2018.1.7 (Ultimate Edition)\r\n  Build #IU-181.5540.23, built on November 12, 2018\r\n  JRE: 1.8.0_152-release-1136-b43 amd64\r\n  JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o\r\n  Windows 10 10.0\r\n  \r\n  \r\n\r\n## 项目结构\r\n\r\n```\r\n└─java\r\n    └─com\r\n        └─jzy\r\n            ├─app    //主函数入口\r\n            ├─demo    //使用示例\r\n            ├─exception    //异常处理类根目录\r\n            │  ├─encryption    //加密类的异常\r\n            │  ├─integer    //整数域计算方法的异常\r\n            │  └─ploynomial    //多项式域计算方法的异常\r\n            ├─gui     //所有图形界面代码的根目录\r\n            ├─util    //工具包\r\n            └─xxaqsxjc    //所有关键方法根目录\r\n                ├─encyption    //加密类根目录\r\n                │  ├─algorithm     //加密类的实现，这里实现了RSA、GoldwasserMicali、Paillier\r\n                │  ├─executor   //加密类接口\r\n                │  └─factory    //加密类工厂实现\r\n                ├─method0     //《信息安全数学基础》（1）（大二下）中涵盖的大部分运算的代码实现\r\n                └─method1     //《信息安全数学基础》（2）（大三上）中涵盖的大部分运算的代码实现\r\n```\r\n\r\n\r\n\r\n## 如何使用代码？\r\n\r\n这里省略对于图形界面的使用教程，正常脑壳的人都能上手。\r\n\r\n* 代码中对您有用的api大部分都涵盖在了`com.jzy.xxaqsxjc`包下，所有代码都有详细的注释\r\n\r\n\r\n这里列举关键方法概览和部分示例。更多的示例请参见`com.jzy.demo`包\r\n\r\n### com.jzy.xxaqsxjc.method0 \r\n\r\n此包主要是大二下《信息安全数学基础》课学习的知识点实现，您可以直接调用Method0.java中的静态方法，其涵盖了该包下大部分功能的api。使用示例如下：\r\n\r\n```java\r\nimport com.jzy.xxaqsxjc.method0.Method0;\r\n\r\nimport java.math.BigInteger;\r\n\r\npublic class Test {\r\n    public static void main(String[] args) {\r\n        BigInteger x=new BigInteger(\"100\");\r\n        BigInteger y=new BigInteger(\"120\");\r\n        //x，y的最大公因数\r\n        System.out.println(Method0.maxCommonFactorXY(x,y));\r\n        //x，y的贝祖等式求解\r\n        BigInteger []r=Method0.bezoutSolveQrSt(x,y);\r\n        System.out.println(\"s=\"+r[0]+\", t=\"+r[1]);\r\n        //费马素性检验\r\n        BigInteger p=new BigInteger(\"912429886857661\");\r\n        System.out.println(Method0.fermat(p));\r\n        //最小原根\r\n        p=new BigInteger(\"23\");\r\n        System.out.println(Method0.minPrimitiveRoot(p));\r\n    }\r\n}\r\n```\r\n\r\n* CalculateMod.java：计算大整数模\r\n* CommonFactorMultiple.java：最大公因数和最小公倍数计算\r\n* BezoutEquationSolution.java：贝祖等式系数求解\r\n* EulerFuction.java：欧拉函数值计算\r\n* Legendre.java：勒让得符号计算\r\n* Jacobi.java：雅可比符号计算\r\n* PrimeTest.java：素性检验，集成了三种素性检验和暴力检验\r\n* PrimitiveRoot.java：原根计算\r\n* ChineseRemainderTheorem.java：中国剩余定理求解\r\n* Method0.java：该包下大部分方法的入口\r\n\r\n### com.jzy.xxaqsxjc.method1\r\n\r\n此包主要是大三上《信息安全数学基础》课学习的知识点实现，您可以直接调用Method1.java中的静态方法，其涵盖了该包下大部分功能的api。使用示例如下：\r\n\r\n```java\r\nimport com.jzy.xxaqsxjc.method1.Method1;\r\nimport com.jzy.xxaqsxjc.method1.Polynomial;\r\n\r\npublic class Test {\r\n    public static void main(String[] args) {\r\n        //1+x+x^2+x^4\r\n        int[] a = {1, 1, 1, 0, 1};\r\n        //1+x^2+x^3+x^4+x^8\r\n        int[] b = {1, 0, 1, 1, 1, 0, 0, 0, 1};\r\n        Polynomial pa = new Polynomial(a);\r\n        Polynomial pb = new Polynomial(b);\r\n        System.out.println(pa);\r\n        System.out.println(pb);\r\n        //多项式计算\r\n        System.out.println(pa.add(pb));\r\n        System.out.println(pa.multiply(pb));\r\n        System.out.println(pb.divide(pa));\r\n        System.out.println(Polynomial.pow(pb, 10));\r\n        //多项式最大公因式\r\n        System.out.println(Method1.maxCommonFactor(pa,pb));\r\n    }\r\n}\r\n```\r\n\r\n* Polynomial.java：多项式计算基础类\r\n\r\n* PolynomialBezoutEquationSolution.java：多项式贝祖等式系数求解\r\n\r\n* PolynomialCalculation.java：多项式其他一些相关计算\r\n\r\n* EllipticCurveCalculationOfFp.java：Fp上的椭圆曲线点的计算\r\n\r\n  该方法不能通过Method1的静态方法调用，需要手工创建实例对象，使用实例如下：\r\n\r\n  ```java\r\n  import com.jzy.xxaqsxjc.method1.EllipticCurveCalculationOfFp;\r\n  \r\n  import java.math.BigInteger;\r\n  import java.util.ArrayList;\r\n  \r\n  public class Test {\r\n      public static void main(String[] args) {\r\n          //传入椭圆曲线参数，创建实例\r\n          EllipticCurveCalculationOfFp eccfp = new EllipticCurveCalculationOfFp(new BigInteger(\"100823\"), new BigInteger(\"3\"), new BigInteger(\"7\"));\r\n          //点P1\r\n          BigInteger[] p1 = {new BigInteger(\"5\"), new BigInteger(\"101\")};\r\n          //计算P1、2P1、3P1、...kP1\r\n          ArrayList\u003cBigInteger[]\u003e rs = eccfp.kPointSet(p1, 27);\r\n          for (int i = 0; i \u003c rs.size(); i++) {\r\n              System.out.println(\"x\" + (i + 1) + \"=\" + rs.get(i)[0]);\r\n              System.out.println(\"y\" + (i + 1) + \"=\" + rs.get(i)[1]);\r\n              System.out.println();\r\n          }\r\n          //计算10P1\r\n          System.out.println(eccfp.kPoint(p1, 10)[0]);\r\n          System.out.println(eccfp.kPoint(p1, 10)[1]);\r\n          //计算当前椭圆曲线的阶\r\n          System.out.println(eccfp.ordFp());\r\n      }\r\n  \r\n  }\r\n  ```\r\n\r\n* EllipticCurveCalculationOfF2n.java：F2n上的椭圆曲线点的计算\r\n\r\n  使用类比EllipticCurveCalculationOfFp.java\r\n\r\n* Method1.java：该包下除椭圆曲线计算所有方法的入口\r\n\r\n### com.jzy.xxaqsxjc.encyption.algorithm\r\n\r\n该包下提供三种加密算法，这里处于代码实现的简便，直接对明文逐个字符进行加密，使用实例如下：\r\n\r\n* RSAEncryption.java：RSA加密算法\r\n\r\n  see more about RSA: *https://en.wikipedia.org/wiki/RSA_(cryptosystem)*\r\n\r\n  * 方法一：通过有参构造器传入明文\r\n\r\n    ```java\r\n    import com.jzy.xxaqsxjc.encyption.algorithm.RSAEncryption;\r\n    \r\n    public class Test {\r\n        public static void main(String[] args) {\r\n            RSAEncryption rsa1 = new RSAEncryption(\"我是明文\");\r\n    //        System.out.println(rsa1.encrypt());  //加密得到密文\r\n    //        System.out.println(rsa1.decrypt());  //解密得到明文\r\n            //这里通过show()方法直观展示加密情况，也可以使用encrypt()单独输出密文等等\r\n            rsa1.show();\r\n        }\r\n    }\r\n    ```\r\n\r\n    ![Snipaste_2019-08-28_14-22-52](screenshot/Snipaste_2019-08-28_14-22-52.jpg)\r\n\r\n  * 方法二：通过无参构造器创建对象，通过setPlainText方法传入明文\r\n\r\n    ```java\r\n    import com.jzy.xxaqsxjc.encyption.algorithm.RSAEncryption;\r\n    \r\n    public class Test {\r\n        public static void main(String[] args) {\r\n            RSAEncryption rsa1 = new RSAEncryption();\r\n            rsa1.setPlainText(\"我是明文\");\r\n            rsa1.show();\r\n        }\r\n    }\r\n    ```\r\n\r\n  * 方法三：通过工厂获得加密类实例（单例），再通过setPlainText方法传入明文\r\n\r\n    ```java\r\n    import com.jzy.xxaqsxjc.encyption.EncryptionAlgorithm;\r\n    import com.jzy.xxaqsxjc.encyption.algorithm.RSAEncryption;\r\n    import com.jzy.xxaqsxjc.encyption.factory.EncryptionFactory;\r\n    \r\n    public class Test {\r\n        public static void main(String[] args) {\r\n            //传入枚举参数RSA，从工厂获得实例\r\n            RSAEncryption rsa1 = (RSAEncryption) EncryptionFactory.getEncryption(EncryptionAlgorithm.RSA);\r\n            rsa1.setPlainText(\"我是明文\");\r\n            rsa1.show();\r\n        }\r\n    }\r\n    ```\r\n\r\n  * 其他：重置密钥\r\n\r\n    默认密钥在编译代码时确定，默认位宽1024bit。可以通过resetKeys()静态方法重置（指定位宽）密钥\r\n\r\n    ```java\r\n    import com.jzy.xxaqsxjc.encyption.EncryptionAlgorithm;\r\n    import com.jzy.xxaqsxjc.encyption.algorithm.RSAEncryption;\r\n    import com.jzy.xxaqsxjc.encyption.factory.EncryptionFactory;\r\n    \r\n    public class Test {\r\n        public static void main(String[] args) {\r\n            //传入枚举参数RSA，从工厂获得实例\r\n            RSAEncryption rsa1 = (RSAEncryption) EncryptionFactory.getEncryption(EncryptionAlgorithm.RSA);\r\n            rsa1.setPlainText(\"我是明文\");\r\n            rsa1.show();\r\n            //重置密钥位宽512bit\r\n            RSAEncryption.resetKeys(512);\r\n            rsa1.setPlainText(\"使用512bit密钥加密，我是明文\");\r\n            rsa1.show();\r\n        }\r\n    }\r\n    ```\r\n\r\n    ![Snipaste_2019-08-28_14-30-22](screenshot/Snipaste_2019-08-28_14-30-22.jpg)\r\n\r\n* GoldwasserMicaliBinaryEncryption.java：GoldwasserMicali二进制串加密算法\r\n\r\n  see more about GoldwasserMicali :*https://en.wikipedia.org/wiki/Goldwasser–Micali_cryptosystem*\r\n\r\n  使用类比RSA加密\r\n\r\n* PaillierEncryption.java：Paillier加密算法\r\n\r\n  see more about Paillier：*https://en.wikipedia.org/wiki/Paillier_cryptosystem*\r\n  \r\n  使用类比RSA加密\r\n\r\n\r\n\r\n## 联系方式\r\n\r\n* qq: 929703621\r\n* wechat: Jzy_bb_1998\r\n* e-mail: 929703621@qq.com\r\n* github：\u003chttps://github.com/jinzhiyun1998/Mathematical-Caculation-Tools\u003e\r\n\r\n欢迎提出意见与建议~","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKuroChan1998%2FMathematical-Caculation-Tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FKuroChan1998%2FMathematical-Caculation-Tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FKuroChan1998%2FMathematical-Caculation-Tools/lists"}