Cara menggunakan php rsa encrypt decrypt

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 2048

Ekstrak 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

 int RSA_public_encrypt(int flen, unsigned char *from,
    unsigned char *to, RSA *rsa, int padding);

 int RSA_private_decrypt(int flen, unsigned char *from,
     unsigned char *to, RSA *rsa, int padding);

 

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

RSA * createRSA(unsigned char * key,int public)
{
    RSA *rsa= NULL;
    BIO *keybio ;
    keybio = BIO_new_mem_buf(key, -1);
    if (keybio==NULL)
    {
        printf( "Failed to create key BIO");
        return 0;
    }
    if(public)
    {
	    rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
    }
    else
    {
	    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa,NULL, NULL);
    }

	return rsa;
}

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

int private_decrypt(unsigned char * enc_data,int data_len,unsigned char * key, unsigned char *decrypted)
{
	RSA * rsa = createRSA(key,0);
	int  result = RSA_private_decrypt(data_len,enc_data,decrypted,rsa,padding);
    return result;
}
_

 

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

int private_encrypt(unsigned char * data,int data_len,unsigned char * key, unsigned char *encrypted)
{
	RSA * rsa = createRSA(key,0);
    int result = RSA_private_encrypt(data_len,data,encrypted,rsa,padding);
    return result;
}
_

3. 2 Dekripsi Kunci Publik
Anda dapat menggunakan fungsi di bawah ini untuk dekripsi kunci publik

int public_decrypt(unsigned char * enc_data,int data_len,unsigned char * key, unsigned char *decrypted)
{
	RSA * rsa = createRSA(key,1);
	int  result = RSA_public_decrypt(data_len,enc_data,decrypted,rsa,padding);
    return result;
}
_

4) Enkripsi dan Dekripsi Contoh kode

openssl rsa -in private.pem -outform PEM -pubout -out public.pem
_0

Referensi. dokumentasi openssl

Apa yang dimaksud decrypt Encrypt?

Enkripsi adalah proses penyandian yang mengubah teks atau pesan asli yang dapat dipahami (plaintext) menjadi teks kode atau pesan yang tidak dapat dipahami (ciphertext). Dekripsi adalah proses pembalikan yang mengubah kode atau pesan yang tidak dapat dipahami (ciphertext) menjadi teks asli.

Apa yang dimaksud dengan Dekripsi?

Sebelum dikirim, teks akan melalui proses yang disebut dekripsi. Proses tersebut adalah proses yang mengubah teks acak menjadi teks normal atau plaintext . Dekripsi ini hanya dapat terjadi jika orang memiliki atau diberi akses untuk melihat data yang dienkripsi.