使用私钥加密并不被视为签名。使用RSA时,实际上可以使用私钥进行加密,但这只是RSA的一个实现细节,它并没有加密消息,而是消息的哈希值,因此验证签名不会恢复原始明文消息。
是的,您可以在OpenSSL中签名和验证签名--参见
https://www.openssl.org/docs/crypto/RSA_sign.html
不,您不应该使用模数和指数来自己编写“教科书式RSA”加密。例如,请参见此处:
https://crypto.stackexchange.com/questions/1448/definition-of-textbook-rsa
不,您不应该通过使用私钥加密数据并使用公钥解密数据来交换私钥和公钥的用途。例如,请参见
https://dev59.com/vHE95IYBdhLWcg3wd9xK#2350959。
更新:
这个页面建议您可以使用OpenSSL C接口来使用私钥进行加密和使用公钥进行解密,方法是通过以下函数原型:
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);
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);
我实际上没有尝试使用这些函数。
我尝试使用openssl rsautl命令行:
$ openssl rsautl -in HELLO -out HELLO.encrypt_by_private -inkey private.pem -encrypt
然而:
$ openssl rsautl -in HELLO.encrypt_by_private -pubin -inkey public.pem -decrypt
A private key is needed for this operation
因此,我会说命令行工具无法完成这个任务。
openssl
还是密码算法库libcrypto
?两者是有区别的。其中一个需要编写代码。对于两者的答案都是可以,但实现的方式显然是不同的。 - WhozCraig