ReactNative RSA加密

项目中遇到需要RSA加密密码,发给服务器,使用了publicEncrypt/privateDecrypt来解决这个问题https://github.com/crypto-browserify/publicEncrypt

步骤1:生成public/private key

可以参考在线生成网址:http://web.chacuo.net/netrsakeypair


let public_key = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgVybCU0BER5sBYwHVNPzNY+iI
gKchmloieZfm5T8qDmSKoZNo6YnPj+LqfilmtMEPFa9jept3kmyMvYX4abx2RQpG
1xlq9piMk+vG29b343uyzdOX85NwQJF7vB57gGRF9Cxo8eA+q9ScQo9xEhvh4Y4Q
Veoa4NaG1xqQ5EAKlQIDAQAB
-----END PUBLIC KEY-----`

let private_key = `-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDgVybCU0BER5sBYwHVNPzNY+iIgKchmloieZfm5T8qDmSKoZNo
6YnPj+LqfilmtMEPFa9jept3kmyMvYX4abx2RQpG1xlq9piMk+vG29b343uyzdOX
85NwQJF7vB57gGRF9Cxo8eA+q9ScQo9xEhvh4Y4QVeoa4NaG1xqQ5EAKlQIDAQAB
AoGASwm7pCo2h+Avn8IfHdKQcJ7na6kkvh+j4H4tagTqIMYZqSksZl4fQ3cMXoT+
kiUJomMNfEfJcrBecKEAC7xKVeCQyO+BlJ9ytJMaPinBhf9xF8hsnUYCcQ9RUItL
p/uXhiT2vUzGWY6Clth54CI034HQsSrXenfUV6U4+QvNqWECQQD3i/4YWgfmLzQ4
935FjqSWsmlO2Ic0leSoTH2mVniTuOiFGkFKnljKjPOmXFvkZfjbKWTCrE4uT/FU
qWuzXVkJAkEA6ABK9ejs2Cc+5hpx85uDRlm4v8dqc5NFnwnd7XcoyFsLck6iPAUJ
2c3ZjZrcU+AMhNrvwi49kIVON/ZVSOlELQJBAM6vXS155kSDvyedRRnQeo20UwbY
9TKrwGngy7xZUH2Okt2nSUKDKYGc5EZPsQ3nMjvSuOVtti0m5Ema12jAFPkCQQCe
mWSlS4BuHBYxs65mvM83Tqqv4CFztSAJIvOmHKmynhrrH7pkkYU0cjbhSRaJ+EZW
pFz3QCkyHQ9lzm5rE5xZAkEAitnlowLTzJnfswUM4j4eYVSU77UsAgV1x5/ksiMG
ovsiemO25gliO4BJTLyeiCqghtCF+DNPLZMRgSyxslhHnA==
-----END RSA PRIVATE KEY-----`

步骤2:加密解密方法

rsa加密/解密常用oeap和pkcs1方法,pkcs1更简单

2.1 OAEPDemo

OAEPDemo() {
    var encrypted = '0bcd6462ad7a563be2d42b0b73e0b0a163886304e7723b025f97605144fe1781e84acdc4031327d6bccd67fe13183e8fbdc8c5fe947b49d011ce3ebb08b11e83b87a77328ca57ee77cfdc78743b0749366643d7a21b2abcd4aa32dee9832938445540ee3007b7a70191c8dc9ff2ad76fe8dfaa5362d9d2c4b31a67b816d7b7970a293cb95bf3437a301bedb9f431b7075aa2f9df77b4385bea2a37982beda467260b384a58258b5eb4e36a0e0bf7dff83589636f5f97bf542084f0f76868c9f3f989a27fee5b8cd2bfee0bae1eae958df7c3184e5a40fda101196214f371606feca4330b221f30577804bbd4f61578a84e85dcd298849f509e630d275280'

    test('publicEncrypt/privateDecrypt', function (t) {
        t.test('can decrypt', function (t) {
            t.plan(2)
            // note encryption is ranomized so can't test to see if they encrypt the same
            t.equals(crypto1.privateDecrypt(rsa.private, new Buffer(encrypted, 'hex')).toString(), 'hello there I am a nice message', 'decrypt it properly')
            t.equals(crypto2.privateDecrypt(rsa.private, new Buffer(encrypted, 'hex')).toString(), 'hello there I am a nice message', 'decrypt it properly')
        })
        t.test('can round trip', function (t) {
            t.plan(2)
            var msg = 'this is a message'
            // note encryption is ranomized so can't test to see if they encrypt the same
            t.equals(crypto1.privateDecrypt(rsa.private, crypto2.publicEncrypt(rsa.public, new Buffer(msg))).toString(), msg, 'round trip it')
            t.equals(crypto2.privateDecrypt(rsa.private, crypto1.publicEncrypt(rsa.public, new Buffer(msg))).toString(), msg, 'round trip it')
        })
    })
}

2.2 测试oaep

testOAEP() {
    var msg = 'this is a message a'

    let es = crypto.publicEncrypt(public_key, new Buffer(msg))
    console.log("--------es:" + es)

    let ds = crypto.privateDecrypt(private_key, es).toString()
    console.log("--------ds:" + ds)
}

2.3 测试pkcs1

testPKCS1() {
    // 测试1:加密/解密
    var msg = 'this is a message a'

    let es = crypto.publicEncrypt({
        padding: 1,
        key: public_key
    }, new Buffer(msg), false)
    console.log("--------es:" + es)
    console.log("--------es hex:"+ es.toString('hex'))

    let ds = crypto.privateDecrypt({
        padding: 1,
        key: private_key
    }, es, false).toString()
    console.log("--------ds:" + ds)

    // 测试2:直接解密密文
    var encrypted = 'c1c12f1278bde247e4c69d3d24ae4d7a1762264883baf4c0765aa57cf8f3f818ce32672357bc49132bf8bf347202a5d8e12097c5bc54213e5e94b6146ba360639c609390ee6c56808ae4210847b113de165838bbb4483808066fbbd0806852ce41693009f48b34f5643ca06c4bede94dae7cd828a10f1d433da9749782608d41'
    let ds2 = crypto.privateDecrypt({
        padding: 1,
        key: private_key
    }, new Buffer(encrypted, 'hex'), false).toString()
    console.log("--------ds2:" + ds2)

}

注意问题:

1.生成密文的长度和明文长度无关,但明文长度不能超过密钥长度

2.遇到react-native不支持nodejs的什么stream、crypto等,可以考虑rn-nodeify使用破解库

https://github.com/mvayngrib/rn-nodeify

参考文章:http://wenku.baidu.com/view/58ba863610661ed9ad51f390.html?re=view

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容