{"id":19747850,"url":"https://github.com/gzu-liyujiang/rsautils","last_synced_at":"2025-06-15T11:37:50.624Z","repository":{"id":93332979,"uuid":"110657246","full_name":"gzu-liyujiang/RSAUtils","owner":"gzu-liyujiang","description":"RSA+AES/RC4+MD5/SHA1+BASE64加密解密。Java及Android平台通用的RSA算法工具类及其例子（敏感信息加密、私钥签名\u0026公钥验签、公钥加密\u0026私钥解密、软件注册码/授权码）","archived":false,"fork":false,"pushed_at":"2020-07-15T05:22:41.000Z","size":266,"stargazers_count":42,"open_issues_count":0,"forks_count":19,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-01-29T23:31:11.512Z","etag":null,"topics":["aes","base64","crc32","md5","pem","privatekey","publickey","rc4","rsa","sha1","sha256"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gzu-liyujiang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"custom":["https://gitee.com/li_yu_jiang"]}},"created_at":"2017-11-14T07:44:55.000Z","updated_at":"2024-01-04T14:31:03.000Z","dependencies_parsed_at":"2023-03-10T09:31:19.162Z","dependency_job_id":null,"html_url":"https://github.com/gzu-liyujiang/RSAUtils","commit_stats":{"total_commits":19,"total_committers":3,"mean_commits":6.333333333333333,"dds":0.368421052631579,"last_synced_commit":"d5d3dc4a187a2ed4d2c782358bb57eac6e02f4d6"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gzu-liyujiang%2FRSAUtils","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gzu-liyujiang%2FRSAUtils/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gzu-liyujiang%2FRSAUtils/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gzu-liyujiang%2FRSAUtils/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gzu-liyujiang","download_url":"https://codeload.github.com/gzu-liyujiang/RSAUtils/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224203232,"owners_count":17272909,"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":["aes","base64","crc32","md5","pem","privatekey","publickey","rc4","rsa","sha1","sha256"],"created_at":"2024-11-12T02:19:05.082Z","updated_at":"2024-11-12T02:19:05.571Z","avatar_url":"https://github.com/gzu-liyujiang.png","language":"Java","funding_links":["https://gitee.com/li_yu_jiang"],"categories":[],"sub_categories":[],"readme":"# RSAUtils\n\n![Release APK](https://github.com/gzu-liyujiang/RSAUtils/workflows/Release%20APK/badge.svg)\n![Gradle Package](https://github.com/gzu-liyujiang/RSAUtils/workflows/Gradle%20Package/badge.svg)\n[![jitpack](https://jitpack.io/v/gzu-liyujiang/RSAUtils.svg)](https://jitpack.io/#gzu-liyujiang/RSAUtils)\n\n\nRSA+RC4/AES+BASE64加密解密。Java及Android平台通用的RSA算法工具类及其例子（敏感信息加密传输、私钥签名\u0026公钥验签、公钥加密\u0026私钥解密、软件注册码/授权码）。\n\n- BASE64编码，BASE64解码。\n- SHA1、MD5、CRC32等校验值。\n- RC4加密，RC4解密。\n- AES加密，AES解密。\n- RSA公钥加密，RSA私钥解密。\n- RSA私钥签名，RSA公钥验证。\n- 软件注册码/授权码。\n\n\n### 远程依赖\n\n```groovy\nallprojects {\n    repositories {\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ndependencies {\n    implementation 'com.github.gzu-liyujiang:RSAUtils:2.0.0'\n}\n```\n\n### 封装的方法\n\n#### Base64Utils\n\n```text\nisBase64\nencodeToString\nencode\ndecodeFromString\ndecode\n```\n\n#### ChecksumUtils\n\n```text\ncalculate\nsha1\nsha256\nsha512\nmd5\ncrc32\n```\n\n#### RC4Utils\n\n```text\nconvert\nencryptToBase64\ndecryptFromBase64\n```\n\n#### AESUtils\n\n```text\nencryptToBase64\nencrypt\ndecryptFromBase64\ndecrypt\n```\n\n#### RSAUtils\n\n```text\n说明：RSA只支持小数据加密，对于大批量数据加密，不建议对数据分段加密，强烈建议使用以下方案：\n第一步：客户端选择合适的对称加密算法（如AES、RC4、XXTEA），该算法须服务端也支持；\n第二步：客户端随机生成一个对称加密算法所用的密码，使用该密码加密数据，再使用RSA公钥加密该密码；\n第三步：服务端使用RSA私钥解密出对称加密算法所用的密码，再使用该密码及同样的对称加密算法解密数据。\n推荐查阅这篇文章帮助理解：https://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html\n```\n```text\nencrypt\nencryptToBase64\ndecrypt\ndecryptFromBase64\nsignature\nsignatureMD5\nsignatureSHA1\nverify\nverifyMD5\nverifySHA1\ngenerateKeyPair\ngenerateCertificate\ngeneratePublicKey\ngeneratePrivateKey\nencodePublicKeyToString\nencodePrivateKeyToString\nprintPublicKeyInfo\nprintPrivateKeyInfo\n```\n\n### 示例\n\n```java\n    private static final String PRIVATE_KEY = \"-----BEGIN RSA PRIVATE KEY-----\\n\" +\n            \"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJV1jJ6vjuSlsj8rwKIF0NJAonad\\n\" +\n            \"E0PIAQtDuo86ByWrkIeMVPLIBRxhutsAUJ761ewN16zdoaSGJBqT4dazN7lb9Nn9Us71UIxHCMc/\\n\" +\n            \"pQljSFPrr1GD2vUfFJu1/HBzpPrOjwBLC80TAuBgQBJ7Uln2kFtdCMFVzYq9FbWSfo/lAgMBAAEC\\n\" +\n            \"gYB8CSsjgsUO4qh0HqZmkHcGFpf94kvbo7+iDppkRR8rVx/CLmdNeUwsirrdB3zhA4DHv5EvKFv+\\n\" +\n            \"w0hxOith2Cg0hYFmmsJtaeWQgGvZO5NxaK8chL/5fUmEU5pO+qqN+uiTEs/CnGL7WYPEKxzKLXDE\\n\" +\n            \"yT9P/I0UnuHkh6THpzUnPQJBAOsE7Y4D0Gk3JG5+M8yVLWUSUi7CwCfdE9Cg5exnucYhlktp1jIk\\n\" +\n            \"2ap0b7Vt0kVaZumuc+LGVPsWCRjTyjDDBr8CQQCizUCk3hOZcqs70ieIrCximIscv4qGFvDsVJEj\\n\" +\n            \"39J7zAwijC+GCDJI4P10NnoOhVUNHghtEhLn5o3SBUU/2VZbAkEAodeb659OxxX1Ha4E586XGzIZ\\n\" +\n            \"rB/rCcihm5shmsH3WazJfhddLNzZlBtozgzZr27IzgWXwkQIQ3xyOUmnxBqZqwJAUJwUwA194uLW\\n\" +\n            \"Sl56WL/3kjI531gv/MjrLfmJjBvNGqMj9w82kMUKMO/GT36R3RLD1CTkwyzJ061i13Tonv68NQJB\\n\" +\n            \"AM3uOj58rPOAFPmMyy2x+SADvGUvp4YtStfIApSrk297WKSocjmv7LIVC4Izh8vBr/scz70PqTkn\\n\" +\n            \"6sZfw+qKdi0=\\n\" +\n            \"-----END RSA PRIVATE KEY-----\";\n    private static final String PUBLIC_KEY = \"-----BEGIN RSA PUBLIC KEY-----\\n\" +\n            \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVdYyer47kpbI/K8CiBdDSQKJ2nRNDyAELQ7qP\\n\" +\n            \"Ogclq5CHjFTyyAUcYbrbAFCe+tXsDdes3aGkhiQak+HWsze5W/TZ/VLO9VCMRwjHP6UJY0hT669R\\n\" +\n            \"g9r1HxSbtfxwc6T6zo8ASwvNEwLgYEASe1JZ9pBbXQjBVc2KvRW1kn6P5QIDAQAB\\n\" +\n            \"-----END RSA PUBLIC KEY-----\";\n\n    public void onRSAAndRC4Encrypt(View view) {\n        String data = edtPlainText.getText().toString();\n        if (TextUtils.isEmpty(data)) {\n            Toast.makeText(this, \"请输入要加密的内容\", Toast.LENGTH_SHORT).show();\n            return;\n        }\n        String password = \"123456\";\n        Logger.print(\"明文密码：\" + password);\n        String encryptedData = RC4Utils.encryptToBase64(data.getBytes(CHARSET), password);\n        Logger.print(\"RC4加密：\" + encryptedData);\n        String encryptedPassword = RSAUtils.encryptToBase64(password.getBytes(CHARSET), RSAUtils.generatePublicKey(PUBLIC_KEY));\n        Logger.print(\"密文密码：\" + encryptedPassword);\n        if (TextUtils.isEmpty(encryptedData) || TextUtils.isEmpty(encryptedPassword)) {\n            Toast.makeText(this, \"加密失败\", Toast.LENGTH_SHORT).show();\n            return;\n        }\n        tvEncryptedData.setText(encryptedData);\n        tvEncryptedPassword.setText(encryptedPassword);\n    }\n\n    public void onRSAAndRC4Decrypt(View view) {\n        String encryptedData = tvEncryptedData.getText().toString();\n        Logger.print(\"RC4密文：\" + encryptedData);\n        String encryptedPassword = tvEncryptedPassword.getText().toString();\n        Logger.print(\"密文密码：\" + encryptedPassword);\n        if (TextUtils.isEmpty(encryptedData) || TextUtils.isEmpty(encryptedPassword)) {\n            Toast.makeText(this, \"还没有加密过数据\", Toast.LENGTH_SHORT).show();\n            return;\n        }\n        byte[] decryptedPassword = RSAUtils.decryptFromBase64(encryptedPassword, RSAUtils.generatePrivateKey(PRIVATE_KEY));\n        if (decryptedPassword == null) {\n            Toast.makeText(this, \"密码解密失败\", Toast.LENGTH_SHORT).show();\n            return;\n        }\n        String password = new String(decryptedPassword, CHARSET);\n        Logger.print(\"明文密码：\" + password);\n        byte[] decryptedData = RC4Utils.decryptFromBase64(encryptedData, password);\n        if (decryptedData == null) {\n            Toast.makeText(this, \"使用\" + password + \"解密失败\", Toast.LENGTH_SHORT).show();\n            return;\n        }\n        String data = new String(decryptedData, CHARSET);\n        Logger.print(\"RC4解密：\" + data);\n        Toast.makeText(this, data, Toast.LENGTH_LONG).show();\n    }\n```\n```text\nW/liyujiang: 明文密码：123456\nW/liyujiang: RC4加密：6EzLgpOt8jXA3r8kHYT7\nW/liyujiang: 密文密码：kMN5bTOmiPJeEvhICc5f3phxRJBkIGzv5rFCxhLISYtDQwF4/1SSRy75QHiR445ZIOCAP4vQM8Tf\n    uaRt0b1wyZ3y1wvVzW9kyBqQvrRUK/p4Vik0KQWoNo/53gx6OSkBQMyufKyR+AKmnA7hybhtw6rI\n    byStBdKUFnuedj4wilk=\nW/liyujiang: RC4密文：6EzLgpOt8jXA3r8kHYT7\nW/liyujiang: 密文密码：kMN5bTOmiPJeEvhICc5f3phxRJBkIGzv5rFCxhLISYtDQwF4/1SSRy75QHiR445ZIOCAP4vQM8Tf\n    uaRt0b1wyZ3y1wvVzW9kyBqQvrRUK/p4Vik0KQWoNo/53gx6OSkBQMyufKyR+AKmnA7hybhtw6rI\n    byStBdKUFnuedj4wilk=\nW/liyujiang: 明文密码：123456\nW/liyujiang: RC4解密：贵州穿青人\nW/liyujiang: 明文密码：123456\nW/liyujiang: AES加密：8Nm9QEl1ns2CB2h3SXdwEiJBgJXdKXzQq9fV+zDvyw==\nW/liyujiang: 密文密码：ADXpK5q5FRK2K+3OcYw7g+0FWkZUXmXCwlU8wds0e/UVLsZEsCb3PRFVjrixgDJ29VFf0fUt8q5f\n    yQF0aCVXjp9XhvcG8bd+uvfyz843+JYuJCkxG07c5ew8V5b3jaZvbXJSmqeke9OIYzW1uAF06J0v\n    /xOy3Mj6HB4EqtytQn0=\nW/liyujiang: AES密文：8Nm9QEl1ns2CB2h3SXdwEiJBgJXdKXzQq9fV+zDvyw==\nW/liyujiang: 密文密码：ADXpK5q5FRK2K+3OcYw7g+0FWkZUXmXCwlU8wds0e/UVLsZEsCb3PRFVjrixgDJ29VFf0fUt8q5f\n    yQF0aCVXjp9XhvcG8bd+uvfyz843+JYuJCkxG07c5ew8V5b3jaZvbXJSmqeke9OIYzW1uAF06J0v\n    /xOy3Mj6HB4EqtytQn0=\nW/liyujiang: 明文密码：123456\nW/liyujiang: AES解密：贵州穿青人\nW/liyujiang: RSA Public Key Info:\n    Format=X.509\n    Algorithm=RSA\n    Modulus.length=1024\n    Modulus=104953803252028535197426100160657684922668618375493745112597393524175584479063111015683560753019906356938393418213334898199604429170091987276594508471023132331190972106077487573027767020111492019066956800371029468935761969205063997496659622858083336985459361235058905357735117119541539005051586887557928882149\n    PublicExponent.length=17\n    PublicExponent=65537\nW/liyujiang: RSA Private Key Info:\n    Format=PKCS#8\n    Algorithm=RSA\n    Modulus.length=1024\n    Modulus=104953803252028535197426100160657684922668618375493745112597393524175584479063111015683560753019906356938393418213334898199604429170091987276594508471023132331190972106077487573027767020111492019066956800371029468935761969205063997496659622858083336985459361235058905357735117119541539005051586887557928882149\n    PrivateExponent.length=1023\n    PrivateExponent=87100911013238018231728766370722047473320772766906164501412326416930678307395265957123658174710464117178422564707036815511516933917209104719268485301897798360238205447720504724819155252062546440415064221202758352446471555751599779280866802775656372630844608280309935707858867334254177374357594610201663973181\nW/liyujiang: registerCode=d0013db0-bc78-4c15-94d9-29e868edbd1b\nW/liyujiang: licenseKey: \n    -----BEGIN LICENSE KEY-----\n    FaBuWoxwwgN3zxy2a1wJ+1j/PdA49OL/PE5Xs5H7Z25gRFMre3mOGqx/2bk4o8AM1vohWQ4w+3XP\n    gmiIrRLSyvNrQJsJyx9UiIRzU4whbmAvY311YDh4hGnDSdsnNzAjfKk1zmme37KciHOXt2ppEs0F\n    8G6PWfUgOp2ju3FUkco=\n    -----END LICENSE KEY-----\nW/liyujiang: licenseKey equals=false\nW/liyujiang: verify result=true\nW/liyujiang: RSA Public Key Info:\n    Format=X.509\n    Algorithm=RSA\n    Modulus.length=1024\n    Modulus=124106268603826661795048085340022418257596887588967694744956976430489086723635626648329590644563639581213759446781317223888301144846473903643152592239713921440575435198781130132381230014534207093431850518652618902266376531123249857646944632569295429814341185407768924940085057500672798877043125502923175896459\n    PublicExponent.length=17\n    PublicExponent=65537\nW/liyujiang: RSA Private Key Info:\n    Format=PKCS#8\n    Algorithm=RSA\n    Modulus.length=1024\n    Modulus=124106268603826661795048085340022418257596887588967694744956976430489086723635626648329590644563639581213759446781317223888301144846473903643152592239713921440575435198781130132381230014534207093431850518652618902266376531123249857646944632569295429814341185407768924940085057500672798877043125502923175896459\n    PrivateExponent.length=1021\n    PrivateExponent=15590056619300603186058245020511943310018910079661484478543659326691891419607004221332703814839621233688946349983495189972042569721013638464676863060238002338303423173947064359393044541216098073843489560820472589984830927213073876715459716982667392850434596591535425879524656324236522962422495572034945137361\n```\n\n### 许可授权\n```text\nCopyright (c) 2019-2020 gzu-liyujiang \u003c1032694760@qq.com\u003e\n\nThe software is licensed under the Mulan PSL v1.\nYou can use this software according to the terms and conditions of the Mulan PSL v1.\nYou may obtain a copy of Mulan PSL v1 at:\n    http://license.coscl.org.cn/MulanPSL\nTHIS SOFTWARE IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR\nPURPOSE.\nSee the Mulan PSL v1 for more details.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgzu-liyujiang%2Frsautils","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgzu-liyujiang%2Frsautils","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgzu-liyujiang%2Frsautils/lists"}