Tôi chỉ có một số kiến thức lý thuyết rất thô sơ về RSA.trao đổi khóa công khai/riêng tư trong mã hóa/giải mã OCSEP PKCS # 1
Trong khi đọc các nguồn khác nhau về cách sử dụng nó trong thực tế, có vẻ như PKCS # 1 OAEP sẽ là một điều tốt.
Để thực hiện thử nghiệm, tôi sử dụng Python với PyCrypto. Ví dụ. this là một ví dụ sử dụng PKCS # 1 OAEP.
Mã hóa bằng khóa công khai và sau đó giải mã bằng khóa riêng hoạt động tốt. Ví dụ. công chúng có thể gửi một số dữ liệu cho người X bằng khóa riêng.
Từ hiểu biết cơ bản về cách thức hoạt động của RSA, tôi nghĩ rằng tôi có thể trao đổi khóa công khai/riêng tư, nghĩa là tôi có thể sử dụng khóa công khai để mã hóa và khóa riêng để giải mã. Ví dụ. người X có thể mã hóa một số dữ liệu bằng khóa riêng của nó và công chúng có thể giải mã nó bằng cách sử dụng khóa công khai. Nếu giải mã hoạt động tốt, điều này cung cấp một số loại bằng chứng cho thấy dữ liệu đến từ người X.
PyCrypto than phiền khi tôi cố gắng giải mã bằng khóa công khai.
Từ đọc mã nguồn PyCrypto, trong _RSAKey._decrypt
function (here), có vẻ như đối tượng chính bản thân biết nếu nó là chìa khóa tư nhân hoặc công cộng và khác nhau giữa chúng (trước sự ngạc nhiên của tôi, một lần nữa dựa trên của tôi rất cơ bản RSA sự hiểu biết).
Từ đó, có vẻ như tôi có thể hack chức năng giải mã để nó sử dụng khóa công khai. Hoặc hơi khác: tôi chỉ có thể trao đổi số mũ công khai e
và số mũ riêng d
trong các đối tượng chính.
Nhưng tất cả điều này có vẻ như nó không có ý định được sử dụng/tấn công theo cách này. Vì vậy, tôi muốn hỏi ở đây về những hiểu lầm của tôi.
Ngoài ra, chỉ vì tò mò, tôi đã tạo một số phím (RSA.generate(2048)
) và xem n
, e
và d
. Trong mọi trường hợp, n
và d
là rất lớn trong khi e
là trong mọi trường hợp hằng số (65537) (Tôi không mong đợi điều đó).
Tôi đoán từ tất cả những điều này mà tôi thực sự không nên chỉ trao đổi e
và d
.
Vì vậy, tôi đoán tôi nên sử dụng một số phương pháp khác cho chữ ký như PKCS1_PSS.
Một số mã cho mã hóa/giải mã, nếu có ai quan tâm: (. binstruct
là một mô-đun nhỏ mà có thể mã hóa/giải mã cây cấu trúc dữ liệu - tương tự như JSON/BSON)
def randomString(l):
import random
return ''.join(chr(random.randint(0, 0xFF)) for i in range(l))
def genkeypair():
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
pubkey = key.publickey().exportKey("DER")
privkey = key.exportKey("DER")
return (pubkey,privkey)
def encrypt(v, rsapubkey):
from Crypto.PublicKey import RSA
rsakey = RSA.importKey(rsapubkey)
from Crypto.Cipher import PKCS1_OAEP
rsa = PKCS1_OAEP.new(rsakey)
import binstruct
from array import array
aeskey = randomString(32)
iv = randomString(16)
from Crypto.Cipher import AES
aes = AES.new(aeskey, AES.MODE_CBC, iv)
data = binstruct.varEncode(v)
data += array("B", (0,) * (-len(data) % 16))
out = binstruct.strEncode(rsa.encrypt(aeskey + iv))
out += array("B", aes.encrypt(data))
return out
def decrypt(stream, rsaprivkey):
from array import array
from StringIO import StringIO
if isinstance(stream, array): stream = stream.tostring()
if isinstance(stream, str): stream = StringIO(stream)
from Crypto.PublicKey import RSA
rsakey = RSA.importKey(rsaprivkey)
from Crypto.Cipher import PKCS1_OAEP
rsa = PKCS1_OAEP.new(rsakey)
import binstruct
aesdata = binstruct.strDecode(stream)
aesdata = rsa.decrypt(aesdata)
aeskey = aesdata[0:32]
iv = aesdata[32:]
from Crypto.Cipher import AES
aes = AES.new(aeskey, AES.MODE_CBC, iv)
class Stream:
buffer = []
def read1(self):
if len(self.buffer) == 0:
nextIn = stream.read(16)
self.buffer += list(aes.decrypt(nextIn))
return self.buffer.pop(0)
def read(self, n):
return "".join([self.read1() for i in range(n)])
v = binstruct.varDecode(Stream())
return v
Đó là nơi tôi nghĩ tôi cũng có thể sử dụng encrypt
bằng khóa riêng và decrypt
bằng khóa công khai.
Việc thực hiện cuối cùng với (hy vọng) ký/xác thực chính xác có thể được tìm thấy here in binstruct.
"PyCrypto than phiền khi tôi cố gắng giải mã bằng khóa công khai". Vui lòng cụ thể hơn và vui lòng hiển thị mã của bạn. –
@GregS: Nó tăng 'TypeError (" Không có khóa riêng ")' trong '_RSAKey._decrypt'. Như bạn có thể thấy từ mã được liên kết. Đó là những gì tôi đã nói. Có vẻ như nó cần khóa riêng trong giải mã. – Albert
Nếu bạn chỉ có kiến thức thô sơ về mật mã, nó không làm gì để sử dụng API theo cách mà nó không được sử dụng. Tôi đã có 10 năm kinh nghiệm và thậm chí tôi khá cẩn thận khi tôi sử dụng các thư viện mật mã theo những cách mà tôi không được phép - và tôi cố gắng tránh làm như vậy bất cứ nơi nào có thể. –