c++ openssl库解密问题

服务器给出的是加密后的信息、公模、指数,现在需要解密。
加密后的信息:6F07A0FF53393F619558DBD2E3EE16BC74F009D4661DB49D25A02E900EDAE56A02C142B07408E06C11E66025A42F9875ACF5FA6E5753FA5E3BF322E7284DBF1ADDB1E8F04C6FB3FBF32EA87838A6907E2A0A329B7AA1F3FC238B3B62B73C7C1AF954ED72C840CCBC49EB2538E8EA7A55C8A30A0764E2D95F59DF91D5BA6E7212

模:
93699723240557642714298223752328168207006127117803470313269635629012817131034121107145129394983372480532303750498616664968561285851237790153779524806068201674946146616076995235171678387337669517216870663016805090450941855464370990772124971064613523571889080169553919406043381049541688440844350694063503328143

指数:
52751041223791366488956578170589134293081741094930754240786067048660404059792711481594010927526534797774079972815309832166257796401533019599826805426624527321616158832674775347472860942794678504268163882233141437031764733191695179159757852053450055046188533293005499003752385892369582823636950131897518571777

解密后应为:正常的数字

服务器端代码如下:
public class RSAUtils {

 /** 
 * 生成公钥和私钥 
 * @throws NoSuchAlgorithmException  
 * 
 */  
public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException{  
    HashMap<String, Object> map = new HashMap<String, Object>();  
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  
    keyPairGen.initialize(1024);  
    KeyPair keyPair = keyPairGen.generateKeyPair();  
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  
    map.put("public", publicKey);  
    map.put("private", privateKey);  
    return map;  
}  
/** 
 * 使用模和指数生成RSA公钥 
 * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA 
 * /None/NoPadding】 
 *  
 * @param modulus 
 *            模 
 * @param exponent 
 *            指数 
 * @return 
 */  
public static RSAPublicKey getPublicKey(String modulus, String exponent) {  
    try {  
        BigInteger b1 = new BigInteger(modulus);  
        BigInteger b2 = new BigInteger(exponent);  
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);  
        return (RSAPublicKey) keyFactory.generatePublic(keySpec);  
    } catch (Exception e) {  
        e.printStackTrace();  
        return null;  
    }  
}  

/** 
 * 使用模和指数生成RSA私钥 
 * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA 
 * /None/NoPadding】 
 *  
 * @param modulus 
 *            模 
 * @param exponent 
 *            指数 
 * @return 
 */  
public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {  
    try {  
        BigInteger b1 = new BigInteger(modulus);  
        BigInteger b2 = new BigInteger(exponent);  
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
        RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);  
        return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);  
    } catch (Exception e) {  
        e.printStackTrace();  
        return null;  
    }  
}  


/**
 * 公钥加密
 * 
 * @param data
 * @param publicKey
 * @return
 * @throws Exception
 */
public static String encryptByPublicKey(String data, RSAPublicKey publicKey)
        throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, publicKey);
    // 模长
    int key_len = publicKey.getModulus().bitLength() / 8;
    // 加密数据长度 <= 模长-11
    String[] datas = splitString(data, key_len - 11);
    String mi = "";
    //如果明文长度大于模长-11则要分组加密
    for (String s : datas) {
        mi += bcd2Str(cipher.doFinal(s.getBytes("UTF-8")));
    }
    return mi;
}

/**
 * 私钥解密
 * 
 * @param data
 * @param privateKey
 * @return
 * @throws Exception
 */
public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey)
        throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    //模长
    int key_len = privateKey.getModulus().bitLength() / 8;
    byte[] bytes = data.getBytes("UTF-8");
    byte[] bcd = ASCII_To_BCD(bytes, bytes.length);
    System.err.println(bcd.length);
    //如果密文长度大于模长则要分组解密
    String ming = "";
    byte[][] arrays = splitArray(bcd, key_len);
    for(byte[] arr : arrays){
        ming += new String(cipher.doFinal(arr));
    }
    return ming;
}

/**
 * ASCII码转BCD码
 * 
 */
public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {
    byte[] bcd = new byte[asc_len / 2];
    int j = 0;
    for (int i = 0; i < (asc_len + 1) / 2; i++) {
        bcd[i] = asc_to_bcd(ascii[j++]);
        bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));
    }
    return bcd;
}
public static byte asc_to_bcd(byte asc) {
    byte bcd;

    if ((asc >= '0') && (asc <= '9'))
        bcd = (byte) (asc - '0');
    else if ((asc >= 'A') && (asc <= 'F'))
        bcd = (byte) (asc - 'A' + 10);
    else if ((asc >= 'a') && (asc <= 'f'))
        bcd = (byte) (asc - 'a' + 10);
    else
        bcd = (byte) (asc - 48);
    return bcd;
}
/**
 * BCD转字符串
 */
public static String bcd2Str(byte[] bytes) {
    char temp[] = new char[bytes.length * 2], val;

    for (int i = 0; i < bytes.length; i++) {
        val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);
        temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');

        val = (char) (bytes[i] & 0x0f);
        temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');
    }
    return new String(temp);
}
/**
 * 拆分字符串
 */
public static String[] splitString(String string, int len) {
    int x = string.length() / len;
    int y = string.length() % len;
    int z = 0;
    if (y != 0) {
        z = 1;
    }
    String[] strings = new String[x + z];
    String str = "";
    for (int i=0; i<x+z; i++) {
        if (i==x+z-1 && y!=0) {
            str = string.substring(i*len, i*len+y);
        }else{
            str = string.substring(i*len, i*len+len);
        }
        strings[i] = str;
    }
    return strings;
}
/**
 *拆分数组 
 */
public static byte[][] splitArray(byte[] data,int len){
    int x = data.length / len;
    int y = data.length % len;
    int z = 0;
    if(y!=0){
        z = 1;
    }
    byte[][] arrays = new byte[x+z][];
    byte[] arr;
    for(int i=0; i<x+z; i++){
        arr = new byte[len];
        if(i==x+z-1 && y!=0){
            System.arraycopy(data, i*len, arr, 0, y);
        }else{
            System.arraycopy(data, i*len, arr, 0, len);
        }
        arrays[i] = arr;
    }
    return arrays;
}

public static void main(String[] args) throws Exception {  
    //加密
    String sysRsaPublicExponent      =  "65537"; //sys 公钥指数
    String sysRsaModulus             =  "120638465331515039018602766102898243545817108824248108758756045538044335002008114706331728819795590465631377302362547268746636029891250" +
            "449814559223888056676854984963129330873452309930246829596744979895825527218697094609496436664015271970577401170500785252151278453045409127914743768611747170785074707487690419"; //sys 模
    RSAPublicKey publickey =  RSAUtils.getPublicKey(sysRsaModulus, sysRsaPublicExponent);
    String msg = RSAUtils.encryptByPublicKey("公钥加密",publickey);
    System.out.println("加密后:"+msg);

    //解密
    String sysRsaPrivateExponent         =  "69691507048707743370070353001445404895625917269420837047873779453901742880754798400624368724803714772247798108968155997295384898479984467247191849129527212787744749050" +
            "17092964178282019340128383046059793475544308917861326270601739489293981014213604544197641773445405470949453568565300025014058699812509971313"; //sys 私钥指数
    RSAPrivateKey privateKey =  RSAUtils.getPrivateKey(sysRsaModulus, sysRsaPrivateExponent);
    msg = RSAUtils.decryptByPrivateKey(msg,privateKey);
    System.out.println("解密后:"+msg);

}  

}

0

1个回答

解密失败了?
加密后的信息、公模、指数,是字符串类型吗,怀疑是BYTE数组等

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Base64编码、解码 C语言例子(使用OpenSSL库)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;unistd.h&gt; #include &lt;openssl/pem.h&gt; #include &lt;openssl/bio.h&gt; #include &lt;openssl/evp.h&gt; int base64_encode(char *i...
基于OpenSSL的RSA加解密的C语言实现
1.该程序是基于OpenSSL的使用纯C语言来实现RSA加解密的,在Linux环境下开发完成,建议在Linux环境下使用(在Windows环境下需要自行修改); 2.该程序具有生成RSA密钥对、RSA公钥加密和RSA私钥解密的功能,支持手动输入密钥; 3.该程序支持不限长度的明文加密,支持256~4096长度的密钥,支持Crypto++密码库生成的RSA密钥对(公钥:X.509,私钥:PKCS#8); 4.该程序包中提供有可供二次开发的接口源文件和可在Linux下使用的.so动态链接库文件; 5.该程序包中提供了相应功能的测试小程序。
openssl pem密钥文件rsa加密解密例子
准备工作 命令行加密解密,用与比对代码中的算法和命令行的算法是否一致 C:\openssl_test>openssl rsautl -encrypt -in data.txt -inkey public.pem -pubin -out data.en C:\openssl_test>openssl rsautl -decrypt -in data.en -inkey private.pe
Linux下使用openssl库编程实现对称加密解密
3DES是加强版的对称加密算法,同时CBC工作模式是最广泛使用的模式,他能够保证加密后的数据块是上下文关联的,不容易受到重放攻击; 编程上使用OpenSSL的EVP接口集能够比较方便地完成加密解密过程,并且不用过多考虑字节补齐的问题,EVP加解密过程中会自动扩充、还原数据长度;
openssl公钥加密私钥解密 &私钥加密公钥解密
// 其他可参考的: 1. http://blog.csdn.net/scape1989/article/details/18959657 2. http://blog.chinaunix.net/uid-23686726-id-3413979.html // 参考:http://hayageek.com/rsa-encryption-decryption-openssl-c/
使用C语言,对OpenSSL命令行加密的文件进行解密
需要使用代码对OpenSSL shell命令加密的文件进行解密需要阅读本文。
C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
#include #include #include #include "openssl/md5.h" #include "openssl/sha.h" #include "openssl/des.h" #include "openssl/rsa.h" #include "openssl/pem.h" // ---- md5摘要哈希 ---- // void md5(const std::
c语言通过openssl aes对称加解密和base64编解码将密码存储成密文
今天遇到这样一个问题,将客户端中的一个密码存储到文件中以供下次使用,但是存储的密码不能直接存储明文,需要进行加密处理,再三考虑之后,这个加密的过程需要双向的可逆的过程,MD5等方式是不适用的,因为记住密码意味着下次我还需要还原这个密码进行使用,所以最后选择了openssl的aes算法,然而aes可行然而用遇到另外一个问题,aes编码字符串之后是乱码,只能用16进制数来显示,这样我使用的glib的k...
解决linux c利用openssl进行3des和安卓封装的接口加密解密出的字符串不一样的问题
做项目中需要对密码进行加密,使用linux的openssl进行3des加密解密,发现加密出来的字符串和安卓封装的接口加密后的字符串不一样,之后发现是安卓端对加密出来的字符进行了base64编码,加上base64编码之后加密解密都正常了。 测试代码: basetype.h#ifndef _BASETYPE_H_ #define _BASETYPE_H_ #include <stdbool.h> #i
C语言利用openSSL库DES模块加密
在通讯过程中为了防止普通的玩家截取协议修改内容并且发送,我们是有必要对协议进行加密的。当前这样的加密手段都已经是变成世界里面的基础设施了。我们只需要将其引入到工程中就好。本文将会基于OpenSSL来编写一个加密、解密的实例。时下流行的加密解密方式有DES/AES。先我们来聊聊历史吧。 历史介绍 DES(Data Encryption Standard) DES一度是电子数据对称加密的
object-c 使用openssl进行 rsa 双向加解密
  IOS系统本身自带的RSA加密类有个特性,那就是加解密是单向的,就是只能 公钥加密-&amp;gt;私钥解密,反之则会报错。   所以很多朋友就会出现这样的情况,在IOS客户端用公钥加密的数据传到服务器端用私钥解密没有问题。但反过来在服务器端用私钥加密的数据传到IOS客户端用公钥解密,就报-9809或-50的错误。你的服务器端可能是JAVA或者其他语言写的。   很多朋友网上找不到解决案例。...
使用openssl进行RSA加密解密
原文:http://blog.csdn.net/zzj806683450/article/details/17426193 我使用openssl 1.0.1e,过程中遇到一些问题。 #include "stdafx.h" #include #include #include #include #include #include #include #include
调用openssl库使用HMAC_SHA256算法小结
本人在撰写代码时遇到需要对一些用户信息进行加密处理的情形。经过查阅资料,当然主要是报大腿成功解决了。下面做一些记录总结。 参考文章: https://blog.csdn.net/yasi_xi/article/details/9066003 https://en.wikipedia.org/wiki/HMAC 环境完善: 该版本需要调用libssl.so.1.0.0,...
使用openssl的aes256加解密算法(带例程 兼容openssl命令)
目的 发布版本时,使用openssl加密版本,放到服务器上 产品升级版本时,下载版本包后,先使用openssl进行解密,然后升级 使用openssl源码 真正需要用到的只有一个结构体和三个函数,注释如下: unsigned char key[32];//密钥字符串,最长32位 unsigned char iv[16];//向量字符串,最长16位 AES_KEY aesKey;//
linux下使用AES cbc加解密文件源码,支持所有类型文件
linux下使用AES cbc加解密文件源码,支持所有类型文件
openssl库C语言完整版
openssl库C语言完整版,包含dll和lib
openssl命令实现文件的加密解密(对称加密)
加密:openssl enc -e -aes256 test.txt -out test.enc -pass pass:123456 解密:openssl enc -d -aes256 -in test.enc -out test.txt -pass pass:123456 test.txt为源文件   test.enc为加密后的文件  123456为对称密钥 使用的AES对称加密法...
openssl C语言编码实现rsa加密
首先介绍下命令台下openssl工具的简单使用:   1)生成一个密钥:   openssl genrsa -out test.key 1024   这里-out指定生成文件的。需要注意的是这个文件包含了公钥和密钥两部分,也就是说这个文件即可用来加密也可以用来解密。后面的1024是生成密钥的长度。   2)openssl可以将这个文件中的公钥提取出来:   openssl rsa -in
OpenSSL中RSA的简易加解密流程
RSA是公钥密码体制的典范,在本实验中,我们的将使用OpenSSL自带的RSA相关函数生成RSA加密体系。下面是可能要使用到的一些函数说明。 (1)RSA *RSA_generate_key(int bits, unsigned long e_value,
C语言利用openSSL库AES模块加密
概述在密码学里面一共有3中分类:1.对称加密/解密对称加密比较常见的有DES/AES。加密方和解密方都持有相同的密钥。对称的意思就是加密和解密都是用相同的密钥。2.非对称加密/解密常见的加密算法DSA/RSA。如果做过Google Pay的话,应该不会陌生。非对称意味着加密和解密使用的密钥不是相同的。这种应用的场合是需要保持发起这的权威性,比如如果一个Google Pay,只能Google来加密产出
java加密解密--openSSL 用法
// TODO
C++ 利用openssl实现DES的CBC模式加解密
利用C++ openssl库实现DES加密算法的CBC模式加解密。源码直接可以利用。 供初学者参考。
linux下用openssl的RSA算法对文件加密解密
Linux下用openssl的RSA算法对文件加密解密
OpenSSL库计算SHA1哈希值 C/C++
下面的C/C++代码实现利用OpenSSL计算SHA1哈希值 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;openssl/sha.h&amp;gt; int main() { unsigned const char ibuf[] = &quot;compute sha1&quot;; unsigned char ob...
Openssl中AES加解密——CBC模式
因工作需要接触了一端是见AES,一些需要注意的地方提醒一下新手,少走一些弯路(个人开发遇到的问题,不对专业名词进行解释)。本人C++开发,所以此文章倾向于C++。 使用Openssl实现的CBC的加解密,所需的Openssl库、头文件和封装类见文章底部。 文章模块: 1、填充模式 2、数据块 3、密码和偏移量 4、输出base64 5、加密模式 6、方法介绍 个模块简单介绍(只涉
linux之用openssl命令Base64编码解码、md5/sha1摘要、AES/DES3加密解密
1、我们先看openssl help命令会输出什么? 2、我们用openssl命令实现字符串和文本的Base64编码和解码 openssl base64 openssl base64 -d 3、我们用openssl命令实现字符串和文本的md5/sha1摘要 4、o
openssl之AES-ecb 加密解密
int main (void)     {         UCHAR    ucEncryptKey[16]  = {0};         UCHAR    ucDecryptKey[16]  = {0};         AES_KEY  aesEncryptKey;         AES_KEY  aesDecryptKey;         UCHAR    ucInData[512...
【 Linux学习】Linux环境下利用OpenSSL对大文件进行AES加解密
一、背景 之前的几篇博客已经介绍了Gitlab如何备份恢复与迁移已经脚本监控过程等。 git学习——&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; Gitlab如何进行备份恢复与迁移? http://blog.csdn.net/ouyang_peng/article/details/77070977 Linux学习–&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;如何通过Shel
基于openssl的RSA加解密实现
一、引言 openssl是一套第三方的关于数据完整性的安全协议,有一些常用的密码算法,数字证书,数字签名等等方面的一些应用。由于项目需求需要用到openssl的包来实现RSA算法的加解密。 二、openssl的安装及错误解决方案 第一步,首先需要在openssl官网下载openssl包http://www.openssl.org/source/;第二步,按照下载的openssl的readme
c++ 基于 openssl 的AES加密
c++ 基于 openssl 的AES加密
windows下vc调用openssl实现RSA加密
     拿到了linux下c实现的RSA调用源码,想在windows下编程实现相同的结果,查了查资料,在vc6和vs2010调试通过,在win7 x64和winXP 32 运行结果一致,记录下来,以备日后查找。 一、安装openssl 1、进入Win32 OpenSSL下载页面,选择适合自己的版本进行下载。建议选择win32版本,程序通用性强,选择非light版本。 2、安装,有个lib位...
摘要算法:使用 openssl 实现 md5、sha256 等
摘要算法:使用 openssl 实现 md5、sha256 等 相关链接: 摘要算法:MD5 及 Java实现样例 摘要算法:SHA 及 Java 实现样例 本文主要介绍如何使用 openssl 库实现 md5、sha256 摘要算法。 Case 1:md5 #include &amp;amp;lt;stdio.h&amp;amp;gt; #include &amp;amp;lt;string.h&amp;amp;gt; #include &amp;amp;lt;...
客户需求解密板子里面的加密文件,qt做的openssl的加解密的tool
客户需求解密板子里面的加密文件,做的openssl的加解密的tooltool去除了加密的,只需要解密,想加密只需反向操作下。源码: https://github.com/leolin0518/openssl_dec_enc_tool记录下: 这个工具是给客户测试使用的 1.主要是公司的RE板子上会把一些config和信息加密备份,客户测试那边想通过一个tool可以解密,查看一些数据。 2.是
OpenSSL和Python实现RSA Key公钥加密私钥解密
基于非对称算法的RSA Key主要有两个用途,数字签名和验证(私钥签名,公钥验证),以及非对称加解密(公钥加密,私钥解密)。本文提供一个基于OpenSSL和Python进行非对称加解密的例子。 1. OpenSSL实现非对称加解密 1.1 生成私钥,并导出公钥 生成2048 bit的PEM格式的RSA Key:Key.pem $ openssl genrsa -out Key....
openssl数字签名和加密
基于linux c openssl 库实现公钥签名私钥验签 公钥加密和私钥解密
openssl rsa 加密,解密,签名,验签简单例子
#include #include #include #include #include #include #include #include #include using namespace std; int padding= RSA_PKCS1_PADDING;  char publicKey[]="-----BEGIN PUBLIC KEY-----\n
基于OpenSSL 1.1.1版实现的SM2加密与解密C程序
    OpenSSL 1.1.1 版提供了对国密 SM2 算法的支持。对于 SM2 加解密算法,在源码的 crypto/sm2 目录下,sm2_crypt.c 文件中实现了 SM2 加密与解密。OpenSSL源码是很好的学习范例,但是 sm2.h, sm3.h, sm4.h 这些头文件是放在源码的 crypto/include/internal 目录下,这就导致用户不能直接调用到 sm2_cry...
使用OPENSSL做简单的加密解密
系统:window xp 工具:openssl(window版的,openssl有链接) 路径: openssl=&gt;C:\OpenSSL-Win32 例子=&gt;C:\ca\demo 场景: A加密消息文件data.txt,把文件给B,B解密 1.生成密钥 a的私钥 [b]C:\OpenSSL-Win32\bin&gt;[/b]openssl genrsa -des3 -out...
linux可执行文件找不到共享库
今天在执行一个ffmpeg程序时,提示:ffmpeg: error while loading shared libraries: libx264.so.152: cannot open shared object file: No such file or directorygoogle了一下,是由于找不到lib这个文件。解决办法:一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库
突破OPENSSL RSA加解密字符串长度 PHP
OPENSSL RSA加密时,明文长度受到限制,字符串长度不能超过 245,所以若非要采用RSA,只能分段进行。一、将明文分段加密再拼接在一起($json是明文字符串,rsaEn是加密函数,$mark是自定义符号,用于分隔每个加密块)function encry($json, $mark) { $ret = null; if(strlen($json) &amp;gt; 245) { ...