Code Monkey home page Code Monkey logo

rsautils's Introduction

RSAUtils

Release APK Gradle Package jitpack

RSA+RC4/AES+BASE64加密解密。Java及Android平台通用的RSA算法工具类及其例子(敏感信息加密传输、私钥签名&公钥验签、公钥加密&私钥解密、软件注册码/授权码)。

  • BASE64编码,BASE64解码。
  • SHA1、MD5、CRC32等校验值。
  • RC4加密,RC4解密。
  • AES加密,AES解密。
  • RSA公钥加密,RSA私钥解密。
  • RSA私钥签名,RSA公钥验证。
  • 软件注册码/授权码。

远程依赖

allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    implementation 'com.github.gzu-liyujiang:RSAUtils:2.0.0'
}

封装的方法

Base64Utils

isBase64
encodeToString
encode
decodeFromString
decode

ChecksumUtils

calculate
sha1
sha256
sha512
md5
crc32

RC4Utils

convert
encryptToBase64
decryptFromBase64

AESUtils

encryptToBase64
encrypt
decryptFromBase64
decrypt

RSAUtils

说明:RSA只支持小数据加密,对于大批量数据加密,不建议对数据分段加密,强烈建议使用以下方案:
第一步:客户端选择合适的对称加密算法(如AES、RC4、XXTEA),该算法须服务端也支持;
第二步:客户端随机生成一个对称加密算法所用的密码,使用该密码加密数据,再使用RSA公钥加密该密码;
第三步:服务端使用RSA私钥解密出对称加密算法所用的密码,再使用该密码及同样的对称加密算法解密数据。
推荐查阅这篇文章帮助理解:https://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html
encrypt
encryptToBase64
decrypt
decryptFromBase64
signature
signatureMD5
signatureSHA1
verify
verifyMD5
verifySHA1
generateKeyPair
generateCertificate
generatePublicKey
generatePrivateKey
encodePublicKeyToString
encodePrivateKeyToString
printPublicKeyInfo
printPrivateKeyInfo

示例

    private static final String PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" +
            "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJV1jJ6vjuSlsj8rwKIF0NJAonad\n" +
            "E0PIAQtDuo86ByWrkIeMVPLIBRxhutsAUJ761ewN16zdoaSGJBqT4dazN7lb9Nn9Us71UIxHCMc/\n" +
            "pQljSFPrr1GD2vUfFJu1/HBzpPrOjwBLC80TAuBgQBJ7Uln2kFtdCMFVzYq9FbWSfo/lAgMBAAEC\n" +
            "gYB8CSsjgsUO4qh0HqZmkHcGFpf94kvbo7+iDppkRR8rVx/CLmdNeUwsirrdB3zhA4DHv5EvKFv+\n" +
            "w0hxOith2Cg0hYFmmsJtaeWQgGvZO5NxaK8chL/5fUmEU5pO+qqN+uiTEs/CnGL7WYPEKxzKLXDE\n" +
            "yT9P/I0UnuHkh6THpzUnPQJBAOsE7Y4D0Gk3JG5+M8yVLWUSUi7CwCfdE9Cg5exnucYhlktp1jIk\n" +
            "2ap0b7Vt0kVaZumuc+LGVPsWCRjTyjDDBr8CQQCizUCk3hOZcqs70ieIrCximIscv4qGFvDsVJEj\n" +
            "39J7zAwijC+GCDJI4P10NnoOhVUNHghtEhLn5o3SBUU/2VZbAkEAodeb659OxxX1Ha4E586XGzIZ\n" +
            "rB/rCcihm5shmsH3WazJfhddLNzZlBtozgzZr27IzgWXwkQIQ3xyOUmnxBqZqwJAUJwUwA194uLW\n" +
            "Sl56WL/3kjI531gv/MjrLfmJjBvNGqMj9w82kMUKMO/GT36R3RLD1CTkwyzJ061i13Tonv68NQJB\n" +
            "AM3uOj58rPOAFPmMyy2x+SADvGUvp4YtStfIApSrk297WKSocjmv7LIVC4Izh8vBr/scz70PqTkn\n" +
            "6sZfw+qKdi0=\n" +
            "-----END RSA PRIVATE KEY-----";
    private static final String PUBLIC_KEY = "-----BEGIN RSA PUBLIC KEY-----\n" +
            "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVdYyer47kpbI/K8CiBdDSQKJ2nRNDyAELQ7qP\n" +
            "Ogclq5CHjFTyyAUcYbrbAFCe+tXsDdes3aGkhiQak+HWsze5W/TZ/VLO9VCMRwjHP6UJY0hT669R\n" +
            "g9r1HxSbtfxwc6T6zo8ASwvNEwLgYEASe1JZ9pBbXQjBVc2KvRW1kn6P5QIDAQAB\n" +
            "-----END RSA PUBLIC KEY-----";

    public void onRSAAndRC4Encrypt(View view) {
        String data = edtPlainText.getText().toString();
        if (TextUtils.isEmpty(data)) {
            Toast.makeText(this, "请输入要加密的内容", Toast.LENGTH_SHORT).show();
            return;
        }
        String password = "123456";
        Logger.print("明文密码:" + password);
        String encryptedData = RC4Utils.encryptToBase64(data.getBytes(CHARSET), password);
        Logger.print("RC4加密:" + encryptedData);
        String encryptedPassword = RSAUtils.encryptToBase64(password.getBytes(CHARSET), RSAUtils.generatePublicKey(PUBLIC_KEY));
        Logger.print("密文密码:" + encryptedPassword);
        if (TextUtils.isEmpty(encryptedData) || TextUtils.isEmpty(encryptedPassword)) {
            Toast.makeText(this, "加密失败", Toast.LENGTH_SHORT).show();
            return;
        }
        tvEncryptedData.setText(encryptedData);
        tvEncryptedPassword.setText(encryptedPassword);
    }

    public void onRSAAndRC4Decrypt(View view) {
        String encryptedData = tvEncryptedData.getText().toString();
        Logger.print("RC4密文:" + encryptedData);
        String encryptedPassword = tvEncryptedPassword.getText().toString();
        Logger.print("密文密码:" + encryptedPassword);
        if (TextUtils.isEmpty(encryptedData) || TextUtils.isEmpty(encryptedPassword)) {
            Toast.makeText(this, "还没有加密过数据", Toast.LENGTH_SHORT).show();
            return;
        }
        byte[] decryptedPassword = RSAUtils.decryptFromBase64(encryptedPassword, RSAUtils.generatePrivateKey(PRIVATE_KEY));
        if (decryptedPassword == null) {
            Toast.makeText(this, "密码解密失败", Toast.LENGTH_SHORT).show();
            return;
        }
        String password = new String(decryptedPassword, CHARSET);
        Logger.print("明文密码:" + password);
        byte[] decryptedData = RC4Utils.decryptFromBase64(encryptedData, password);
        if (decryptedData == null) {
            Toast.makeText(this, "使用" + password + "解密失败", Toast.LENGTH_SHORT).show();
            return;
        }
        String data = new String(decryptedData, CHARSET);
        Logger.print("RC4解密:" + data);
        Toast.makeText(this, data, Toast.LENGTH_LONG).show();
    }
W/liyujiang: 明文密码:123456
W/liyujiang: RC4加密:6EzLgpOt8jXA3r8kHYT7
W/liyujiang: 密文密码:kMN5bTOmiPJeEvhICc5f3phxRJBkIGzv5rFCxhLISYtDQwF4/1SSRy75QHiR445ZIOCAP4vQM8Tf
    uaRt0b1wyZ3y1wvVzW9kyBqQvrRUK/p4Vik0KQWoNo/53gx6OSkBQMyufKyR+AKmnA7hybhtw6rI
    byStBdKUFnuedj4wilk=
W/liyujiang: RC4密文:6EzLgpOt8jXA3r8kHYT7
W/liyujiang: 密文密码:kMN5bTOmiPJeEvhICc5f3phxRJBkIGzv5rFCxhLISYtDQwF4/1SSRy75QHiR445ZIOCAP4vQM8Tf
    uaRt0b1wyZ3y1wvVzW9kyBqQvrRUK/p4Vik0KQWoNo/53gx6OSkBQMyufKyR+AKmnA7hybhtw6rI
    byStBdKUFnuedj4wilk=
W/liyujiang: 明文密码:123456
W/liyujiang: RC4解密:贵州穿青人
W/liyujiang: 明文密码:123456
W/liyujiang: AES加密:8Nm9QEl1ns2CB2h3SXdwEiJBgJXdKXzQq9fV+zDvyw==
W/liyujiang: 密文密码:ADXpK5q5FRK2K+3OcYw7g+0FWkZUXmXCwlU8wds0e/UVLsZEsCb3PRFVjrixgDJ29VFf0fUt8q5f
    yQF0aCVXjp9XhvcG8bd+uvfyz843+JYuJCkxG07c5ew8V5b3jaZvbXJSmqeke9OIYzW1uAF06J0v
    /xOy3Mj6HB4EqtytQn0=
W/liyujiang: AES密文:8Nm9QEl1ns2CB2h3SXdwEiJBgJXdKXzQq9fV+zDvyw==
W/liyujiang: 密文密码:ADXpK5q5FRK2K+3OcYw7g+0FWkZUXmXCwlU8wds0e/UVLsZEsCb3PRFVjrixgDJ29VFf0fUt8q5f
    yQF0aCVXjp9XhvcG8bd+uvfyz843+JYuJCkxG07c5ew8V5b3jaZvbXJSmqeke9OIYzW1uAF06J0v
    /xOy3Mj6HB4EqtytQn0=
W/liyujiang: 明文密码:123456
W/liyujiang: AES解密:贵州穿青人
W/liyujiang: RSA Public Key Info:
    Format=X.509
    Algorithm=RSA
    Modulus.length=1024
    Modulus=104953803252028535197426100160657684922668618375493745112597393524175584479063111015683560753019906356938393418213334898199604429170091987276594508471023132331190972106077487573027767020111492019066956800371029468935761969205063997496659622858083336985459361235058905357735117119541539005051586887557928882149
    PublicExponent.length=17
    PublicExponent=65537
W/liyujiang: RSA Private Key Info:
    Format=PKCS#8
    Algorithm=RSA
    Modulus.length=1024
    Modulus=104953803252028535197426100160657684922668618375493745112597393524175584479063111015683560753019906356938393418213334898199604429170091987276594508471023132331190972106077487573027767020111492019066956800371029468935761969205063997496659622858083336985459361235058905357735117119541539005051586887557928882149
    PrivateExponent.length=1023
    PrivateExponent=87100911013238018231728766370722047473320772766906164501412326416930678307395265957123658174710464117178422564707036815511516933917209104719268485301897798360238205447720504724819155252062546440415064221202758352446471555751599779280866802775656372630844608280309935707858867334254177374357594610201663973181
W/liyujiang: registerCode=d0013db0-bc78-4c15-94d9-29e868edbd1b
W/liyujiang: licenseKey: 
    -----BEGIN LICENSE KEY-----
    FaBuWoxwwgN3zxy2a1wJ+1j/PdA49OL/PE5Xs5H7Z25gRFMre3mOGqx/2bk4o8AM1vohWQ4w+3XP
    gmiIrRLSyvNrQJsJyx9UiIRzU4whbmAvY311YDh4hGnDSdsnNzAjfKk1zmme37KciHOXt2ppEs0F
    8G6PWfUgOp2ju3FUkco=
    -----END LICENSE KEY-----
W/liyujiang: licenseKey equals=false
W/liyujiang: verify result=true
W/liyujiang: RSA Public Key Info:
    Format=X.509
    Algorithm=RSA
    Modulus.length=1024
    Modulus=124106268603826661795048085340022418257596887588967694744956976430489086723635626648329590644563639581213759446781317223888301144846473903643152592239713921440575435198781130132381230014534207093431850518652618902266376531123249857646944632569295429814341185407768924940085057500672798877043125502923175896459
    PublicExponent.length=17
    PublicExponent=65537
W/liyujiang: RSA Private Key Info:
    Format=PKCS#8
    Algorithm=RSA
    Modulus.length=1024
    Modulus=124106268603826661795048085340022418257596887588967694744956976430489086723635626648329590644563639581213759446781317223888301144846473903643152592239713921440575435198781130132381230014534207093431850518652618902266376531123249857646944632569295429814341185407768924940085057500672798877043125502923175896459
    PrivateExponent.length=1021
    PrivateExponent=15590056619300603186058245020511943310018910079661484478543659326691891419607004221332703814839621233688946349983495189972042569721013638464676863060238002338303423173947064359393044541216098073843489560820472589984830927213073876715459716982667392850434596591535425879524656324236522962422495572034945137361

许可授权

Copyright (c) 2019-2020 gzu-liyujiang <[email protected]>

The software is licensed under the Mulan PSL v1.
You can use this software according to the terms and conditions of the Mulan PSL v1.
You may obtain a copy of Mulan PSL v1 at:
    http://license.coscl.org.cn/MulanPSL
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
PURPOSE.
See the Mulan PSL v1 for more details.

rsautils's People

Contributors

liyujiang-gzu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.