T. Horsten explained the size limits on raw encryption. Here are two functions to encrypt/decrypt larger data when you can't use the envelope functions:
function ssl_encrypt($source,$type,$key){
//Assumes 1024 bit key and encrypts in chunks.
$maxlength=117;
$output='';
while($source){
$input= substr($source,0,$maxlength);
$source=substr($source,$maxlength);
if($type=='private'){
$ok= openssl_private_encrypt($input,$encrypted,$key);
}else{
$ok= openssl_public_encrypt($input,$encrypted,$key);
}
$output.=$encrypted;
}
return $output;
}
function ssl_decrypt($source,$type,$key){
// The raw PHP decryption functions appear to work
// on 128 Byte chunks. So this decrypts long text
// encrypted with ssl_encrypt().
$maxlength=128;
$output='';
while($source){
$input= substr($source,0,$maxlength);
$source=substr($source,$maxlength);
if($type=='private'){
$ok= openssl_private_decrypt($input,$out,$key);
}else{
$ok= openssl_public_decrypt($input,$out,$key);
}
$output.=$out;
}
return $output;
}
Pada artikel ini, saya telah menjelaskan bagaimana melakukan Enkripsi dan Dekripsi RSA dengan OpenSSL Library di C
1). Hasilkan kunci RSA dengan OpenSSL
Gunakan perintah di bawah ini untuk menghasilkan kunci RSA dengan panjang 2048
openssl genrsa -out private.pem 2048Ekstrak kunci publik dari pribadi. pem dengan perintah berikut
openssl rsa -in private.pem -outform PEM -pubout -out public.pem_publik. pem adalah kunci publik RSA dalam format PEM
pribadi. pem adalah kunci pribadi RSA dalam format PEM
2). Enkripsi Publik dan Dekripsi Pribadi
Di bawah ini adalah API OpenSSL untuk enkripsi Publik dan dekripsi Pribadi
2. 1 Mempersiapkan Struktur RSA
Untuk enkripsi dan dekripsi kita perlu menyiapkan struktur RSA. Gunakan fungsi di bawah ini untuk membuat RSA dengan buffer kunci
Penggunaan untuk kunci publik. createRSA(“PUBLIC_KEY_BUFFER”,1);
Penggunaan untuk kunci pribadi. createRSA(“PRIVATE_KEY_BUFFER”,0);
Jika Anda ingin membuat RSA dengan nama file kunci, Anda dapat menggunakan fungsi ini
RSA * createRSAWithFilename(char * filename,int public) { FILE * fp = fopen(filename,"rb"); if(fp == NULL) { printf("Unable to open file %s \n",filename); return NULL; } RSA *rsa= RSA_new() ; if(public) { rsa = PEM_read_RSA_PUBKEY(fp, &rsa,NULL, NULL); } else { rsa = PEM_read_RSAPrivateKey(fp, &rsa,NULL, NULL); } return rsa; }_
2. 1 Enkripsi Kunci Publik
Untuk enkripsi kita bisa menggunakan padding, di bawah ini adalah daftar padding yang didukung
RSA_PKCS1_PADDING
PKCS #1 v1. 5 bantalan. Ini adalah mode yang paling banyak digunakan saat ini
RSA_PKCS1_OAEP_PADDING
EME-OAEP sebagaimana didefinisikan dalam PKCS #1 v2. 0 dengan SHA-1, MGF1 dan parameter enkode kosong. Mode ini direkomendasikan untuk semua aplikasi baru
RSA_SSLV23_PADDING
PKCS #1 v1. 5 padding dengan modifikasi khusus SSL yang menunjukkan bahwa server mampu SSL3
RSA_NO_PADDING
Enkripsi RSA mentah. Mode ini hanya boleh digunakan untuk mengimplementasikan mode padding suara kriptografis dalam kode aplikasi. Mengenkripsi data pengguna secara langsung dengan RSA tidak aman
Anda dapat menggunakan metode di bawah ini, untuk mengenkripsi data dengan kunci publik
int padding = RSA_PKCS1_PADDING; int public_encrypt(unsigned char * data,int data_len,unsigned char * key, unsigned char *encrypted) { RSA * rsa = createRSA(key,1); int result = RSA_public_encrypt(data_len,data,encrypted,rsa,padding); return result; }Catatan. enkripsi kunci publik mendukung semua bantalan
2. 2 Dekripsi Pribadi
Anda dapat menggunakan metode di bawah ini untuk mendekripsi data dengan kunci pribadi
3). Enkripsi Kunci Pribadi dan Dekripsi Kunci Publik
Di bawah ini adalah API OpenSSL untuk enkripsi pribadi dan dekripsi publik
int RSA_private_encrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding); int RSA_public_decrypt(int flen, unsigned char *from, unsigned char *to, RSA *rsa, int padding);Catatan. enkripsi kunci pribadi hanya mendukung bantalan ini. RSA_PKCS1_PADDING dan RSA_NO_PADDING
3. 1 Enkripsi Kunci Pribadi
Anda dapat menggunakan fungsi di bawah ini untuk enkripsi kunci pribadi
3. 2 Dekripsi Kunci Publik
Anda dapat menggunakan fungsi di bawah ini untuk dekripsi kunci publik
4) Enkripsi dan Dekripsi Contoh kode
openssl rsa -in private.pem -outform PEM -pubout -out public.pem_0Referensi. dokumentasi openssl