openssl實(shí)現(xiàn)C++與JAVA互相RSA,AES加解密

這里主要是openssl常用的編碼Base64, 摘要算法MD5,對(duì)稱(chēng)加密AES, 非對(duì)稱(chēng)加密RSA與Java互通

一: openssl交叉編譯

openssl源碼下載, NDK下載
這里下載的openssl版本是1.1.0f, NDK版本是21, Ubuntu18,解壓openssl代碼包執(zhí)行 config或者Configure可以查看編譯時(shí)的附加參數(shù)列表, NDK如何編譯,在developer NDK文檔中都有詳細(xì)介紹,也有編譯時(shí)的示例腳本,要編譯的第三庫(kù)也一般會(huì)提供config, configure相關(guān)編譯參數(shù)文件,./執(zhí)行即可查看

NDK官方文檔

就是根據(jù)下載的NDK包配置好編譯時(shí)對(duì)應(yīng)的CC(編譯C代碼)/CXX(編譯C++),在NDK21時(shí)都已經(jīng)采用clang(棄用了gcc)和SYSROOT等路徑,openssl1.1.0f是純C寫(xiě)的只要配置CC就行,這里編譯的shell腳本在項(xiàng)目源碼中,已經(jīng)編譯了arm64-v8a和armeabi-v7a的包

二:openssl與java互相加解密

openssl中文手冊(cè),這里只介紹C++與JAVA相互編解,加解密時(shí)的注意點(diǎn)

1:Base64

android已經(jīng)提供好android.util.Base64類(lèi), 編解碼時(shí)注意byte[]轉(zhuǎn)換編碼格式一致即可

const char *data = env->GetStringUTFChars(_data, JNI_FALSE);

//GetStringUTFChars 與java代碼data.getBytes(UTF8)對(duì)應(yīng)編碼一致即可

Base64.encode(data.getBytes(UTF8))
2:MD5

同樣在byte[]轉(zhuǎn)換時(shí)統(tǒng)一編碼格式,摘要算法后的byte[]統(tǒng)一轉(zhuǎn)16進(jìn)制及統(tǒng)一大小寫(xiě)即可

std::string MD5Code::md5(const char *src, size_t src_len) {
    unsigned char md[16];
    MD5((unsigned char *) src, src_len, md);
    char md5str[33]{0};  //MD5結(jié)果 32 + \0
    for (int i = 0; i < 16; i++) {
        sprintf(md5str, "%s%02x", md5str, md[i]);
    }
    return md5str;
}
3:AES

加密模式如ECB,CBC,填充方式一致即可如PKCS5Padding,ZEROPading,加密后的byte[]轉(zhuǎn)換base64時(shí)的編碼也要一致 (如下openssl部分填充方式代碼)

void Padding::padding(std::string &src, int alignSize, PaddingModel mode) {
    int remainder = src.length() % alignSize;
    int paddingSize = (remainder == 0) ? alignSize : (alignSize - remainder);
    switch (mode) {
        case PKCS5OR7:
            src.append(paddingSize, paddingSize);
            break;
        case ZERO:
        default:
            src.append(paddingSize, 0);
            break;
    }
}
4: RSA (一般用加密AES需要的KEY)

openssl的公私鑰采用的是PEM格式,JAVA采用的是DER格式,openssl生成的PEM格式的公私鑰通過(guò)bouncycastlel轉(zhuǎn)換成DER格式及生成密鑰時(shí)的長(zhǎng)度一致即可, 加解密時(shí)的填充方式如(PKCS1Padding)一致
如部分轉(zhuǎn)換PEM成DER格式公鑰代碼

public static PublicKey getFromPemPublicKey(String public_key) throws Exception {
        byte[] keyBytes = new sun.misc.BASE64Decoder().decodeBuffer(public_key);
        ASN1InputStream in = new ASN1InputStream(keyBytes);
        DERObject obj = in.readObject();
        RSAPublicKeyStructure pStruct = RSAPublicKeyStructure.getInstance(obj);
        RSAPublicKeySpec spec = new RSAPublicKeySpec(pStruct.getModulus(), pStruct.getPublicExponent());
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }

測(cè)試如


測(cè)試!!

最后是源碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,312評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,993評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,667評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,410評(píng)論 6 411
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,778評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,955評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,521評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,266評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,468評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,696評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,095評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,385評(píng)論 1 294
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,193評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,431評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容