国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > OS > 安卓 > 正文

android、ios與服務器端php使用rsa加密解密通訊

2024-06-28 16:05:35
字體:
來源:轉載
供稿:網友

最近做手機項目,服務器端使用的是php,客戶端分別有android版及ios版,在部分通訊環節需要對內容進行加密,RSA加密演算法是一種非對稱加密演算法,能夠較好達到要求,不過如果服務器架設https服務,較為麻煩,系統效率也不高,我們只需要在部分重要接口上使用RSA加密解密就行。首先,準備工作

openssl genrsa -out rsa_PRivate_key.pem 1024openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pemopenssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一條命令生成原始 RSA私鑰文件 rsa_private_key.pem,第二條命令將原始 RSA私鑰轉換為 pkcs8格式,第三條生成RSA公鑰 rsa_public_key.pem從上面看出通過私鑰能生成對應的公鑰,因此我們將私鑰private_key.pem用在服務器端,公鑰發放給android跟ios等前端

第二步,php服務器端,使用openssl方法來進行加密解密類,代碼如下:

<?php/** * @author alun (http://alunblog.duapp.com) * @version 1.0 * @created 2013-5-17 */ class Rsa{private static $PRIVATE_KEY = '-----BEGIN PRIVATE KEY-----MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAM9nUm7rPNhSgvsdjMuCd5E7IMJB/80A1YY7jYV9fBCKdhVKmqea26QYuw6FW7B00fppEUTSazduSmn9Yvhx9UOCcI75b0nq9FWm5O4P+Kp8l31M1pwsJ3cm+DceGOrFsl47vh9idiqj+abIlJ4sTmJmDghmbks9YFlZSndQsIBlAgMBAAECgYAasa6vbgF3yi7niScc7l7bR2Pw/LOivA+/ZhzR6JO2QUvvc5myJsFMPo6c0Nc7P93iv/EkDX0VNlHHkIBTf79URHXMgXwMad4pHAeOiqxk5A9w/szDCBoETngtoQQGJq+QINxwPVvDEO4i224Uj3MKg2fo4SDy3P1GCAAj1ahNoQJBAP4FV9vLWdLOOwOLnBpXt6vru4HT5VIf9fCeBIemuQ4C/yRtgU38zXWgZ8AAmS6EjBEUDnN/tWid6UBKfgPDwAkCQQDRBP+Y9wIYIaSxeL7BnHhPT25yAJCGK+l6r2qeaHVQr81O9YjusEi8E2M5OxCRolKxC3L7hrLJX8z1oyOVdNx9AkBqYGhzpgv+qNiz2mJL8dH8ECMc8lTFeJbw5eu1tw8mHAEnCyisNSMBkGQCVv3PKjjR6hlHKwMYRZDpmIh/IRmpAkEAr1soLGaeZSxkhVetgbUJ4k/bct0yYr4YZQshwcAVHBpBforT1JwkiVUim3MIFYY/JbVbQ9XfzL4Ir9OsGMkv6QJAPaQnyNY5/D0PhXqODOM6jtAHHRfaSi4gve6AZ0iRz6YlB8beJ1ywZaJZWD9Cuw3zy4dDpCOnA4tBsIdpMMoT+w==-----END PRIVATE KEY-----';    /**    *返回對應的私鑰    */    private static function getPrivateKey(){            $privKey = self::$PRIVATE_KEY;                 return openssl_pkey_get_private($privKey);          }     /**     * 私鑰加密     */    public static function privEncrypt($data)    {        if(!is_string($data)){                return null;        }                   return openssl_private_encrypt($data,$encrypted,self::getPrivateKey())? base64_encode($encrypted) : null;    }            /**     * 私鑰解密     */    public static function privDecrypt($encrypted)    {        if(!is_string($encrypted)){                return null;        }        return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey()))? $decrypted : null;    }} ?>

打開private_key.pem,將上面的$PRIVATE_KEY,替換成private_key.pem的內容即可,服務器端我們只需要使用私鑰來加密解密。

第三步,android前端,使用java的Cipher類來實現加密解密類,代碼如下:

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.security.KeyFactory;import java.security.NoSuchAlgorithmException;import java.security.PublicKey;import java.security.spec.X509EncodedKeySpec;import javax.crypto.Cipher; import android.util.Base64; /** * @author alun (http://alunblog.duapp.com) * @version 1.0 * @created 2013-5-17 */public class Rsa {    private static final String RSA_PUBLICE =            "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDPZ1Ju6zzYUoL7HYzLgneROyDC" + "/r" +            "Qf/NANWGO42FfXwQinYVSpqnmtukGLsOhVuwdNH6aRFE0ms3bkpp/WL4cfVDgnCO" + "/r" +            "+W9J6vRVpuTuD/iqfJd9TNacLCd3Jvg3HhjqxbJeO74fYnYqo/mmyJSeLE5iZg4I" + "/r" +            "Zm5LPWBZWUp3ULCAZQIDAQAB";    private static final String ALGORITHM = "RSA";     /**     * 得到公鑰     * @param algorithm     * @param bysKey     * @return     */    private static PublicKey getPublicKeyFromX509(String algorithm,            String bysKey) throws NoSuchAlgorithmException, Exception {        byte[] decodedKey = Base64.decode(bysKey,Base64.DEFAULT);        X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodedKey);         KeyFactory keyFactory = KeyFactory.getInstance(algorithm);        return keyFactory.generatePublic(x509);    }     /**     * 使用公鑰加密     * @param content     * @param key     * @return     */    public static String encryptByPublic(String content) {        try {            PublicKey pubkey = getPublicKeyFromX509(ALGORITHM, RSA_PUBLICE);             Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");            cipher.init(Cipher.ENCRYPT_MODE, pubkey);             byte plaintext[] = content.getBytes("UTF-8");            byte[] output = cipher.doFinal(plaintext);             String s = new String(Base64.encode(output,Base64.DEFAULT));             return s;         } catch (Exception e) {            return null;        }    }     /**    * 使用公鑰解密    * @param content 密文    * @param key 商戶私鑰    * @return 解密后的字符串    */    public static String decryptByPublic(String content) {        try {            PublicKey pubkey = getPublicKeyFromX509(ALGORITHM, RSA_PUBLICE);            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");            cipher.init(Cipher.DECRYPT_MODE, pubkey);            InputStream ins = new ByteArrayInputStream(Base64.decode(content,Base64.DEFAULT));            ByteArrayOutputStream writer = new ByteArrayOutputStream();            byte[] buf = new byte[128];            int bufl;            while ((bufl = ins.read(buf)) != -1) {                byte[] block = null;                if (buf.length == bufl) {                block = buf;                } else {                block = new byte[bufl];                for (int i = 0; i < bufl; i++) {                    block[i] = buf[i];                }                }                writer.write(cipher.doFinal(block));            }            return new String(writer.toByteArray(), "utf-8");        } catch (Exception e) {            return null;        }    } }

需要注意的是,在初始化Cipher對象時,一定要指明使用"RSA/ECB/PKCS1Padding"格式如Cipher.getInstance("RSA/ECB/PKCS1Padding");打開rsa_public_key.pem文件,將上面代碼的RSA_PUBLICE替換成其中內容即可。

第四步,ios前端,iOS上沒有直接處理RSA加密的API,網上說的大多數也是處理X.509的證書的方法來實現,不過X.509證書是帶簽名的,在php端openssl_pkey_get_private方法獲取密鑰時,第二個參數需要傳簽名,而android端實現X.509證書加密解密較為不易,在這里我們利用ios兼容c程序的特點,利用openssl的api實現rsa的加密解密,代碼如下:CRSA.h代碼:

#import <Foundation/Foundation.h>#include <openssl/rsa.h>#include <openssl/pem.h>#include <openssl/err.h> typedef enum {    KeyTypePublic,    KeyTypePrivate}KeyType; typedef enum {    RSA_PADDING_TYPE_NONE       = RSA_NO_PADDING,    RSA_PADDING_TYPE_PKCS1      = RSA_PKCS1_PADDING,    RSA_PADDING_TYPE_SSLV23     = RSA_SSLV23_PADDING}RSA_PADDING_TYPE; @interface CRSA : NSObject{    RSA *_rsa;}+ (id)shareInstance;- (BOOL)importRSAKeyWithType:(KeyType)type;- (int)getBlockSizeWithRSA_PADDING_TYPE:(RSA_PADDING_TYPE)padding_type;- (NSString *) encryptByRsa:(NSString*)content withKeyType:(KeyType)keyType;- (NSString *) decryptByRsa:(NSString*)content withKeyType:(KeyType)keyType;@end

CRSA.m代碼

#import "CRSA.h" #define BUFFSIZE  1024#import "Base64.h" #define PADDING RSA_PADDING_TYPE_PKCS1@implementation CRSA + (id)shareInstance{    static CRSA *_crsa = nil;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _crsa = [[self alloc] init];    });    return _crsa;}- (BOOL)importRSAKeyWithType:(KeyType)type{    FILE *file;    NSString *keyName = type == KeyTypePublic ? @"public_key" : @"private_key";    NSString *keyPath = [[NSBundle mainBundle] pathForResource:keyName ofType:@"pem"];         file = fopen([keyPath UTF8String], "rb");         if (NULL != file)    {        if (type == KeyTypePublic)        {            _rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL);            assert(_rsa != NULL);        }        else        {            _rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL);            assert(_rsa != NULL);        }                 fclose(file);                 return (_rsa != NULL) ? YES : NO;    }         return NO;} - (NSString *) encryptByRsa:(NSString*)content withKeyType:(KeyType)keyType{    if (![self importRSAKeyWithType:keyType])         return nil;         int status;    int length  = [content length];    unsigned char input[length + 1];    bzero(input, length + 1);    int i = 0;    for (; i < length; i++)    {        input[i] = [content characterAtIndex:i];    }         NSInteger  flen = [self getBlockSizeWithRSA_PADDING_TYPE:PADDING];         char *encData = (char*)malloc(flen);    bzero(encData, flen);         switch (keyType) {        case KeyTypePublic:            status = RSA_public_encrypt(length, (unsigned char*)input, (unsigned char*)encData, _rsa, PADDING);            break;                     default:            status = RSA_private_encrypt(length, (unsigned char*)input, (unsigned char*)encData, _rsa, PADDING);            break;    }         if (status)    {        NSData *returnData = [NSData dataWithBytes:encData length:status];        free(encData);        encData = NULL;                 NSString *ret = [returnData base64EncodedString];        return ret;    }         free(encData);    encData = NULL;         return nil;} - (NSString *) decryptByRsa:(NSString*)content withKeyType:(KeyType)keyType{    if (![self importRSAKeyWithType:keyType])        return nil;         int status;     NSData *data = [content base64DecodedData];    int length = [data length];         NSInteger flen = [self getBlockSizeWithRSA_PADDING_TYPE:PADDING];    char *decData = (char*)malloc(flen);    bzero(decData, flen);         switch (keyType) {        case KeyTypePublic:            status = RSA_public_decrypt(length, (unsigned char*)[data bytes], (unsigned char*)decData, _rsa, PADDING);            break;                     default:            status = RSA_private_decrypt(length, (unsigned char*)[data bytes], (unsigned char*)decData, _rsa, PADDING);            break;    }         if (status)    {        NSMutableString *decryptString = [[NSMutableString alloc] initWithBytes:decData length:strlen(decData) encoding:NSASCIIStringEncoding];        free(decData);        decData = NULL;                 return decryptString;    }         free(decData);    decData = NULL;         return nil;} - (int)getBlockSizeWithRSA_PADDING_TYPE:(RSA_PADDING_TYPE)padding_type{    int len = RSA_size(_rsa);         if (padding_type == RSA_PADDING_TYPE_PKCS1 || padding_type == RSA_PADDING_TYPE_SSLV23) {        len -= 11;    }         return len;}@end

其中openssl api包,我們可以在第一步RSA密鑰生成工具openssl的include文件夾中得到


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
男人操女人免费网站| 五月婷婷丁香激情| av激情在线| 免费在线黄色av| av网址在线免费观看| 天堂√中文在线| 四虎精品视频| 亚洲网站一区| 国产乱精品一区二区三区| 亚洲sss视频| 在线免费黄色毛片| 国产精品不卡一区二区三区在线观看| free性亚洲| 男女午夜视频在线观看| 欧美黑人乱大交ⅹxxxxx| 国产中文在线| 懂色av一区| 国产天堂av| 国产二区在线播放| 18成年在线观看| 日本成a人片在线观看| 国产在线观看av| 一二三四区在线观看| 99热在线观看免费| 亚洲第一页在线播放| 国产欧美黑人| 午夜免费福利在线观看| www狠狠操| 国产福利在线| 黄色av网站在线免费观看| 国产视频二区| 九九热视频免费在线观看| 国产毛片在线| 亚洲日本久久久午夜精品| 国产视频中文字幕| 久久久久久久久久久久久91| 国产黄大片在线观看画质优化| 麻豆国产在线播放| 四虎成人欧美精品在永久在线| 国产一卡2卡3卡四卡网站| 九九热视频免费在线观看| 四虎久久影院| japanese色国产在线看视频| 2021av天天| 午夜国产视频| 午夜视频99| 中文字幕国产视频| 国产男女无套在线播放| 久久五月精品| 国产女人在线观看| 天堂在线亚洲| 最新国产在线| 最好2018中文免费视频| 最新中文字幕av专区| 国产美女被草| 国产精品扒开做爽爽爽的视频| 中文字幕日本在线观看| 最新亚洲精品国自产在线观看| 天天操天天操天天色天天要| 黄网站在线观看高清免费| 国产主播福利在线| 国产一级片网站| 国产传媒在线播放| av在线电影观看| 国产在线看片| 精品国产美女福利到在线不卡| 在线观看午夜av| 国产中文字幕在线视频| 国产羞羞视频在线播放| 在线观看免费黄色| 国产精品亚洲第五区在线| 99爱视频在线观看| www免费在线观看| 日本中文字幕在线2020| 国产欧美日韩专区| 日p在线观看| 国产黄色高清在线| 久草福利资源在线视频| 国产传媒在线播放| 福利资源在线久| 97视频在线观看网站| 碰草在线视频| 中文国产字幕在线观看| 最新中文字幕在线视频| 四虎成人精品在永久在线观看| 久久亚洲天堂| 日本综合一区二区三区| 国产aa视频| 国产理论片免费观看| 2018狠狠干| 国产一级片在线| 国产免费av在线| h视频在线网站| 国产黄色片在线观看| 超碰免费在线观看| 夜夜爽夜夜操| 亚洲最新永久观看在线| 国产日韩精品在线看| 国产卡一卡二卡三| 黄色电影网站在线观看| 爱福利在线视频| jlzzjlzz欧美大全| av在线网页| 牛牛精品视频在线| av中文天堂在线| www.xxx黄| 久久久久国产精品嫩草影院| 免费高清av| 国产主播福利在线| 国产乱视频在线观看播放| 国产在线视频福利| 高潮毛片在线观看| 丁香婷婷在线观看| 国产小视频福利在线| 国产偷窥洗澡视频| 97在线免费| 99reav| 亚洲综合色视频在线观看 | 国产在线二区| 麻豆av电影在线观看| 国产麻豆麻豆| 国产精品伦一区二区三区视频| 国产高清视频在线播放| 精品一区二区三区在线观看l| 2021av天天| www在线视频| 国产特级嫩嫩嫩bbb| 在线观看免费高清完整| 国产中文在线观看| 在线天堂中文www视软件| gogo高清在线播放免费| 久久亚洲天堂| 国产福利免费观看| 国产美女在线一区二区三区| 精品欧美色视频网站在线观看| 欧洲有码在线视频| 国产福利在线看| 黄色在线视频观看网站| 亚洲欧美日韩一区成人| 国产美女视频一区二区三区| 精品国产白色丝袜高跟鞋| 天天操天天射天天插| а√最新版地址在线天堂| 国产精品视频流白浆免费视频| av在线播放网| 国产啊啊啊视频在线观看| 久久久久久77777| 在线播放国产区| 国产精品欧美韩国日本久久| 女同一区二区免费aⅴ| 国产porn在线| 国产网站在线播放| 国产精品作爱| 国产原创精品视频| 久久久久久久久亚洲精品| 中文在线观看视频| 在线一区观看| 国产福利视频在线观看| 国产区高清在线| 国产丝袜在线播放| 国产精品白浆流出视频| 中文字幕乱在线伦视频乱在线伦视频| 羞羞视频在线免费看| 伊人影院蕉久影院在线播放| 国产黄色网页| 精品无人乱码| av免费网站在线观看| 亚洲电影先锋| 蜜桃视频中文字幕| 国产美女高潮| 国产欧美日韩第一页| 92国产在线视频| eeuss影院www在线播放| 免费日本黄色| 中文字幕日本在线| 国产成人精品久久一区二区小说 | 午夜视频99| 国产区av在线| 国产aa视频| а√资源新版在线天堂| 久久99精品久久久久久野外| 国产蜜臀在线| 精品久久久久一区二区三区| gogo在线高清视频| 国产毛片视频| 国产www在线观看| 免费国产视频| 国产成a人亚洲精v品| 天天激情综合| 天堂在线看视频| 四虎成年永久免费网站| 天天爱天天做色综合| 精品麻豆一区二区三区 | 国产伦精品一区二区三区高清版禁| 天堂在线免费av| 91国内精品久久久久| 九九热视频在线| 99热免费观看| 国产黄色在线| 国产一级在线观看www色|