标签: public-key-encryption

使用公钥和私钥(用于加密)加密困惑

当客户向我的服务器询问许可证时,我正在制作许可证系统,如果允许他们拥有许可证,我会向他们发送许可证.

在我当前的系统上,我使用单个私钥加密许可证,并将公钥嵌入客户端应用程序中,用于解密许可证.有用!

其他人告诉我,我应该使用服务器上的公钥加密并将私钥分发给客户端.我搜索过网络,可以看到有时他们使用私钥加密,有时他们使用公钥加密.

在这种情况下,我该怎么办?

java encryption drm public-key-encryption private-key

7
推荐指数
1
解决办法
2458
查看次数

在浏览器中使用javascript进行openssl解密

我正在寻找一种方法来客户端解码RSA和openssl编码的消息.

想法:
特殊数据仅在服务器上使用公钥加密存储,以便没有人能够看到真实数据 - 即使在服务器黑客的情况下也是如此.
然后,adminforce中的管理员可以通过将这些文件传输到浏览器来"打开"这些文件,并且一些javascript代码将对数据进行解码,以便它永远不会在服务器上解密,只能在安全的客户端上解密.
我真的需要它在浏览器中使用自定义javascript解码direclty,因为这些数据随后被js中的某些算法客户端使用.

问题:
javascript中似乎没有openssl库,或者我还没找到.虽然RSA有几个纯js实现,但它们只实现了普通的RSA算法,但是普通的RSA不能用作块密码并且有一些攻击如"选择明文攻击".
有没有人知道openssl解码的javascript实现,或firefox/chrome的插件,它将这些功能添加到文档中?或者javascript中内置的任何其他安全的非对称加密?

javascript openssl cryptography rsa public-key-encryption

7
推荐指数
1
解决办法
5228
查看次数

使用OpenSSL加密和解密错误0x0407106B

我在C中编写一个例程,用公钥读取base64字符串并继续加密字符串.我也测试相同的字符串的解密,但我在尝试解码时收到错误0x0407106B:

$ openssl errstr 0x0407106B
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
Run Code Online (Sandbox Code Playgroud)

这是代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <openssl/rsa.h>
#include <openssl/engine.h>

//#define PADDING RSA_PKCS1_OAEP_PADDING
#define PADDING RSA_PKCS1_PADDING
//#define PADDING RSA_NO_PADDING

main() {

// public key
char *b64_pKey = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp2w+8HUdECo8V5yuKYrWJmUbL\ntD6nSyVifN543axXvNSFzQfWNOGVkMsCo6W4hpl5eHv1p9Hqdcf/ZYQDWCK726u6\nhsZA81AblAOOXKaUaxvFC+ZKRJf+MtUGnv0v7CrGoblm1mMC/OQI1JfSsYi68Epn\naOLepTZw+GLTnusQgwIDAQAB\n-----END PUBLIC KEY-----\n";

// private key
char *b64priv_key = "-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQCp2w+8HUdECo8V5yuKYrWJmUbLtD6nSyVifN543axXvNSFzQfW\nNOGVkMsCo6W4hpl5eHv1p9Hqdcf/ZYQDWCK726u6hsZA81AblAOOXKaUaxvFC+ZK\nRJf+MtUGnv0v7CrGoblm1mMC/OQI1JfSsYi68EpnaOLepTZw+GLTnusQgwIDAQAB\nAoGBAKDuq3PikblH/9YS11AgwjwC++7ZcltzeZJdGTSPY1El2n6Dip9ML0hUjeSM\nROIWtac/nsNcJCnvOnUjK/c3NIAaGJcfRPiH/S0Ga6ROiDfFj2UXAmk/v4wRRUzr\n5lsA0jgEt5qcq2Xr/JPQVGB4wUgL/yQK0dDhW0EdrJ707e3BAkEA1aIHbmcVfCP8\nY/uWuK0lvWxrIWfR5MlHhI8tD9lvkot2kyXiV+jB6/gktwk1QaFsy7dCXn7w03+k\nxrjEGGN+kQJBAMuKf55lDtU9K2Js3YSStTZAXP+Hz7XpoLxmbWFyGvBx806WjgAD\n624irwS+0tBxkERbRcisfb2cXmAx8earT9MCQDZuVCpjBWxd1t66qYpgQ29iAmG+\njBIY3qn9uOOC6RSTiCCx1FvFqDMxRFmGdRVFxeyZwsVE3qNksF0Zko0MPKECQCEe\noDV97DP2iCCz5je0R5hUUM2jo8DOC0GcyR+aGZgWcqjPBrwp5x08t43mHxeb4wW8\ndFZ6+trnntO4TMxkA9ECQB+yCPgO1zisJWYuD46KISoesYhwHe5C1BQElQgi9bio\nU39fFo88w1pok23a2CZBEXguSvCvexeB68OggdDXvy0=\n-----END RSA PRIVATE KEY-----\n";

// String to encrypt
char *str = "1234";

ERR_load_crypto_strings();  

BIO *bpo = BIO_new_mem_buf(b64_pKey, -1);
RSA *pubKey = PEM_read_bio_RSA_PUBKEY(bpo, NULL, NULL, NULL); …
Run Code Online (Sandbox Code Playgroud)

c openssl rsa public-key-encryption

7
推荐指数
1
解决办法
1万
查看次数

如何在Java中为私有密钥和公共密钥组合共享密钥

我正在阅读关于公钥公钥加密的维基百科(http://en.wikipedia.org/wiki/Public-key_cryptography),其中包含:

在Diffie-Hellman密钥交换方案中,每一方生成公钥/私钥对并分发公钥......在获得彼此公钥的真实副本后,Alice和Bob可以离线计算共享密钥.例如,共享密钥可以用作对称密码的密钥.

我想知道如何在Java中实现这一目标?即,给定一个任意的公钥和一个任意的私钥,如何从中产生一个共享秘密?

为了更清楚:

Alice有一个公钥/私钥对key_pair_alice,

Bob有一个公钥/私钥对key_pair_bob,

假设我的理解是正确的,应该有一个方法combine_keys(),以便:

combine_keys(key_pair_alice.private, key_pair_bob.public) == 
    combine_keys(key_pair_alice.public, key_pair_bob.private) 
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在Java中实现combine_keys()方法.

谢谢.

java cryptography public-key-encryption

7
推荐指数
1
解决办法
6415
查看次数

OpenSSL RSA:无法加密/解密长度超过16个字节的消息

我正在研究一个使用OpenSSL进行基本RSA加密和解密的简单程序.它对于小消息(<16字节)工作正常,但对于任何事情都失败了.我知道公钥加密的局限性在于您无法加密任何比密钥大小更长的内容.在我的情况下,我使用的是1024位密钥,因此我应该使用128字节(由于填充可能会略微减少),对吗?如果是这样,那不是我正在经历的.

这是我的程序的输出,有15个字节:

Generating RSA keypair...done.
Message to encrypt: 0123456789ABCDE
16 bytes encrypted
Decrypted message: 0123456789ABCDE
Run Code Online (Sandbox Code Playgroud)

并且有16个字节:

Generating RSA keypair...done.
Message to encrypt: 0123456789ABCDEF
16 bytes encrypted
140153837057696:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad     decrypt:evp_enc.c:467:
Decrypted message: (null)
Run Code Online (Sandbox Code Playgroud)

似乎无论如何,只加密了16个字节.

我的加密功能(通过修复更新):

unsigned char* rsa_seal(EVP_PKEY *pub_key, unsigned char *msg, size_t **enc_msg_len, unsigned char **sym_key, int *sym_key_len, unsigned char **iv) {
    size_t msg_len = strlen((char*)msg);
    unsigned char *encrypt = malloc(EVP_PKEY_size(pub_key));

    EVP_CIPHER_CTX *ctx = malloc(sizeof(EVP_CIPHER_CTX));
    EVP_CIPHER_CTX_init(ctx);

    *sym_key = malloc(EVP_PKEY_size(pub_key));
    *iv = malloc(EVP_MAX_IV_LENGTH);

    **enc_msg_len = 0;

    if(!EVP_SealInit(ctx, EVP_aes_128_cbc(), sym_key, sym_key_len, …
Run Code Online (Sandbox Code Playgroud)

c openssl rsa public-key-encryption

7
推荐指数
1
解决办法
2972
查看次数

使用证书加密

我对所有这些加密事件都很陌生,我正在尝试使用一个简单的应用来加密给定的字符串.这是我的代码:

public static X509Certificate2 getPublicKey()
{
    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

    X509Certificate2 cert2 = new X509Certificate2("c:\\certificate.cer");

    return cert2;
}


public static string cipherRequest(byte[] stringToEncrypt)
{
    X509Certificate2 certificate = getPublicKey();

    RSACryptoServiceProvider rsa = certificate.PublicKey.Key as RSACryptoServiceProvider;

    byte[] cryptedData = rsa.Encrypt(stringToEncrypt, true);

    return Convert.ToBase64String(cryptedData);
}

public static void Main()
{

    try
    {

        ASCIIEncoding ByteConverter = new ASCIIEncoding();

        byte[] test = ByteConverter.GetBytes("stringtoencrypt");

        string first = cipherRequest(test);
        string second= cipherRequest(test);

        Console.WriteLine("first: {0}", first);
        Console.WriteLine("second: {0}", second);

    }
    catch(CryptographicException e)
    {
        Console.WriteLine(e.Message);
    }

}
Run Code Online (Sandbox Code Playgroud)

因此每次我调用 …

c# certificate public-key-encryption

7
推荐指数
1
解决办法
2万
查看次数

将NSData转换为SecKeyRef

我有一个公钥,我从远程服务器收集,我想用该公钥执行RSA加密.但问题是我将公钥数据作为缓冲区中的字节数组.我可以将它转换为NSData但我无法转换为SecKeyRef所以我可以继续加密.我的加密代码如下:

+(NSString *)encryptRSA:(NSString *)plainTextString withKey:(SecKeyRef)publicKey {
size_t cipherBufferSize = SecKeyGetBlockSize(publicKey);
uint8_t *cipherBuffer = malloc(cipherBufferSize);
uint8_t *nonce = (uint8_t *)[plainTextString UTF8String];
SecKeyEncrypt(publicKey,
              kSecPaddingOAEP,
              nonce,
              strlen( (char*)nonce ),
              &cipherBuffer[0],
              &cipherBufferSize);
NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];
return [encryptedData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
Run Code Online (Sandbox Code Playgroud)

}

如您所见,我需要SecKeyRef对象类型来完成加密.但我的RSA公钥是在NSData变量中.那么我怎样才能将NSData转换为SecKeyRef对象类型.提前致谢.

encryption rsa public-key-encryption nsdata ios

7
推荐指数
1
解决办法
6134
查看次数

带SSL的简单RMI服务器

尝试使用SSL加密设置简单的RMI服务器.这是一个简单的聊天应用程序,它有一个java服务器应用程序和一个java客户端应用程序,但是,我现在甚至无法使用简单的RMI示例!

我能让它工作的唯一方法是客户端和服务器都具有相同的信任库和密钥库.但对我来说,这听起来不正确,因为它意味着每个客户端都有服务器的私钥.

我按照本指南创建了信任/密钥库.我首先尝试生成密钥库和信任库,然后使用密钥库和带有信任库的客户端运行服务器.这不起作用,所以我然后为每个生成一对并加载,如下面的代码所示.

它认为我可能会遗漏一些显而易见的东西,因为我的生活中我不知道我做错了什么.我目前有以下内容,但在运行服务器时,我收到以下错误:

错误:

Server exception: java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.newCall(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
    at Server.main(Server.java:38)
Run Code Online (Sandbox Code Playgroud)

Hello.java

import java.rmi.Remote;
import java.rmi.RemoteException; …
Run Code Online (Sandbox Code Playgroud)

java ssl rmi keystore public-key-encryption

7
推荐指数
1
解决办法
6863
查看次数

Base64中的X.509证书公钥

我正在尝试找到我正在使用的证书的base64公钥.我在证书的详细信息选项卡中找到的公钥不是base64,我被要求提供base64公钥.

有没有办法获得base64版本的公钥?可以通过从证书中获取公钥并将其加密到base64来完成吗?例如,下面是我为证书找到的公钥:

"30 82 01 0a 02 82 01 01 00 bc 39 25 06 5d 99 a4 05 5f e7 fc 59 1f 28 b5 48 d2 0d 2e ea aa eb ed 74 ef c9 2f 90 f8 ad 96 80 24 0f c2 dc 71 58 ea 3e fa 5c c9 29 87 51 7c cb 54 28 7c f9 10 15 b0 ac 8f eb 9e d3 d7 70 35 93 8a c7 1f 45 97 …

base64 ssl-certificate public-key-encryption x509

7
推荐指数
1
解决办法
2万
查看次数

如何在Android中保护我的加密密钥?

SQLCipher在我的Android应用程序中实现了它的数据库安全性.SQLCipher需要一个密钥来加密数据库文件.我面临的问题是密钥保护,如果我的应用程序在root设备上使用或者是逆向工程,那么我的密钥将被公开并且数据库可以被解密.

请注意,每次用户打开密码时我的应用程序都不会要求输入密码,因此用户输入的密码不能用作密钥.我想实现像facebook,whatsapp应用程序这样的行为,它使用私钥/密钥加密数据而不需要任何密码并让用户始终保持登录状态.这些应用程序在何处以及如何存储密钥?

请建议一个能够保护密钥的解决方案/算法.此外,Android OS是否提供任何此类功能以进行数据保护/管理?

android public-key-encryption sqlcipher-android

7
推荐指数
1
解决办法
836
查看次数