首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >加密后如何解密才能恢复原来的字符串?

加密后如何解密才能恢复原来的字符串?
EN

Stack Overflow用户
提问于 2020-07-09 14:47:31
回答 1查看 121关注 0票数 0

我是iOS和Swift的新手。我想用公钥加密一个字符串。公钥是这样的:

代码语言:javascript
运行
AI代码解释
复制
"-----BEGIN PUBLIC KEY-----
Some String
-----END PUBLIC KEY-----"

我对它进行了搜索,得到并实现了以下代码:

代码语言:javascript
运行
AI代码解释
复制
static func encrypt(string: String, publicKey: String?) -> String? {
        guard let publicKey = publicKey else { return nil }

        let keyString = publicKey.replacingOccurrences(of: "-----BEGIN PUBLIC KEY-----\n", with: "").replacingOccurrences(of: "\n-----END PUBLIC KEY-----", with: "")
        guard let data = Data(base64Encoded: keyString) else { return nil }

        var attributes: CFDictionary {
            return [kSecAttrKeyType         : kSecAttrKeyTypeRSA,
                    kSecAttrKeyClass        : kSecAttrKeyClassPublic,
                    kSecAttrKeySizeInBits   : 2048,
                    kSecReturnPersistentRef : kCFBooleanTrue] as CFDictionary
        }

        var error: Unmanaged<CFError>? = nil
        guard let secKey = SecKeyCreateWithData(data as CFData, attributes, &error) else {
            print(error.debugDescription)
            return nil
        }
        return encrypt(string: string, publicKey: secKey)
    }

    static func encrypt(string: String, publicKey: SecKey) -> String? {
        let buffer = [UInt8](string.utf8)

        var keySize   = SecKeyGetBlockSize(publicKey)
        var keyBuffer = [UInt8](repeating: 0, count: keySize)

        // Encrypto  should less than key length
        guard SecKeyEncrypt(publicKey, SecPadding.PKCS1, buffer, buffer.count, &keyBuffer, &keySize) == errSecSuccess else { return nil }
        return Data(bytes: keyBuffer, count: keySize).base64EncodedString()
    }

再次感谢StackOverflow。现在的问题是我无法解密这个函数返回的加密字符串。对于编码,我想要一个2048位的大小。对于Android,加密是这样做的:

代码语言:javascript
运行
AI代码解释
复制
public String encryptKey() throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, CertificateException {

 

        publicKey = getPublicKey();

 

        Cipher oaepFromAlgo = Cipher.getInstance("RSA/NONE/OAEPWITHSHA-256ANDMGF1PADDING");
        oaepFromAlgo.init(Cipher.ENCRYPT_MODE, publicKey );
        //byte[] ct = oaepFromAlgo.doFinal(secretKey.toString().getBytes(StandardCharsets.UTF_8));
        byte[] ct = oaepFromAlgo.doFinal(secretKey.getEncoded());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return Base64.getEncoder().encodeToString(ct);
        }
        else{
            return android.util.Base64.encodeToString(ct,android.util.Base64.DEFAULT);
        }
    }

 

    private PublicKey getPublicKey() throws CertificateException {
        CertificateFactory f = CertificateFactory.getInstance("X.509");
        X509Certificate certificate = (X509Certificate)f.generateCertificate(getTrustedCertificatesInputStream());
        return certificate.getPublicKey();
    }

如果有人能指导我如何解密,以及我的加密过程是否类似于android,那将是非常有帮助的。

EN

回答 1

Stack Overflow用户

发布于 2020-07-10 11:28:28

由衷地感谢每一个试图解决这个问题的人。我设法自己完成了这件事。通过将crt文件转换为der,我将公钥提取为secKey,而不是以字符串形式表示公钥

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62817541

复制
相关文章
python字符串加密与解密
符串进行加密与解密 设计应用程序时,为了防止一些敏感信息的泄露,通常需要对这些信息进行加密。 以用户的登录密码为例,如果密码以明文的形式存储在数据表中,很容易就会被人发现;相反,如果密码以密文的形式储存,即使别人从数据表中发现了密码,也是加密之后的密码,根本不能使用。通过对密码进行加密,能够极大地提高系统的保密性。 加密与解密: 加密的方法一经公开,就不成其为密. 所以你要你的加密方法还没有被破解,就可以使用. 加密就象是变戏法, 戏法人人会变,巧妙各有不同. 加密字符串的思路: s1 = jiami ( s ) s 称为原文, s1 称为密文 如果从 s1 存在一个函数 ffjiami( s1 ) 求出 s , 称 jiami 是可逆变换. 否则称为不可逆变换. 本文介绍的是可逆变换加密方法的例子. (1) 将字符串s 变为 bytearray 数组 b = byteaaray( s.encode( "gbk")) (2) 将 b 经过某种变换 成为另一个 字节数组 c 关键是 这种变换应该是可逆的, 并且保证 c 能够通过 下面的第(3) 变为一个字符串. (3) 将 c 转换成普通字符串 s1 = c.decode( "gbk") ( 4 ) 解密过程是上述过程的逆过程 #coding=gbk # 字符串加密初探 # 入口 : s 要加密的串 # key 你的密钥 一个字节 1~255之间的整数 # 返回: 加密后的串 def jiaMi( s , key ): b = bytearray( str(s).encode("gbk") ) n = len(b) # 求出 b 的字节数 c = bytearray( n*2 ) j = 0 for i in range( 0, n ): b1 = b[i] b2 = b1 ^ key # b1 = b2^ key c1 = b2 % 16 c2 = b2 // 16 # b2= c2*16 + c1 c1 = c1 + 65 c2 = c2 + 65 # 由于c1,c2都是 0~15之间的数, # 加上65就变成了A-P 的字符的编码 c[j] = c1 c[j+1] = c2 j = j+2 return c.decode("gbk") def ffjiaMi( s, key ): c = bytearray( str(s).encode("gbk") ) n = len(c) # 求出 b 的字节数 if n % 2 != 0 : return "" n = n // 2 b = bytearray( n ) j = 0 for i in range( 0, n ): c1 = c[j] c2 = c[j+1] j = j+2 c1 = c1 - 65 c2 = c2 - 65 b2 = c2*16 + c1 b1 = b2^ key b[i]= b1 try: return b.decode("gbk") except: return "解密失败" key = 15 s = "my dear black hole , haha! " s1 = jiaMi( s, key ) s2 = ffjiaMi( s1,key ) print( "原文=", s) print( "密文=", s1) print( "解密:")
py3study
2020/01/08
2.7K0
HDOJ/HDU 1200 To and Fro(加密解密字符串)
Problem Description Mo and Larry have devised a way of encrypting messages. They first decide secretly on the number of columns and write the message (letters only) down the columns, padding with extra random letters so as to make a rectangular array of letters. For example, if the message is “There’s no place like home on a snowy night” and there are five columns, Mo would write down
谙忆
2021/01/21
5770
PHP的加密解密字符串函数建议收藏
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120746.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/15
1K0
如何解密并恢复被.mkp勒索病毒加密的数据库文件?
引言: 近年来,勒索病毒已经成为网络安全领域中最为恶劣和具有挑战性的威胁之一。它们通过加密用户的敏感数据,并勒索赎金来造成严重的经济和业务损失。91数据恢复研究院在本文将深入探讨一种名为.mkp的勒索病毒,并提供针对.mkp勒索病毒感染导致数据库文件加密的恢复方法和预防措施。 如果受感染的数据确实有恢复的价值与必要性,您可添加我们的技术服务号(shujuxf)进行免费咨询获取数据恢复的相关帮助。
用户7824549
2023/05/13
1.8K0
如何解密并恢复被.mkp勒索病毒加密的数据库文件?
C#对字符串进行加密解密
明志德道
2023/10/21
3970
C#对字符串进行加密解密
27-字符串加密和解密算法
思路 根据题意,思路是比较好想的,但是要注意以下两点 加密时,要注意偏移之后的值(下标 + 5)不能超能ascii码所能表示的范围。 解秘时,要注意偏移之后的值(下标 - 5)不能小于0,所以需要加上N然后取模。 代码 #include <stdio.h> #include <string.h> /* * 在本实例中要求设计一个加密和解密算法。 * 在对一个指定的字符串加密之后,利用解密函数能够对密文解密,显示明文信息。 * 加密的方式是将字符串中每个字符加上它在字符串中的位置和一个偏移值 5。
lexingsen
2022/02/25
1.3K0
C语言实现字符串的加密和解密
在项目开发中,为了防止一些敏感信息的泄露,通常我们会对这些信息进行加密,比如用户的登录密码,如果不加密直接进行明文存储的话,就很容易被人看到,但密码对用户来说是保密的,因此我们需要对数据进行加密后再存储,这样一来,即使被看到也是我们加密后的数据,从而大大提高了安全性。
C语言中文社区
2022/05/30
1.7K0
C语言实现字符串的加密和解密
如何使用Java进行加密和解密
在Java中,我们可以使用许多不同的加密和解密技术来保护数据。这些技术可以用于加密密码、保护敏感数据、网络通信等。下面将介绍Java中常用的加密和解密技术和实现方法。
用户1289394
2023/09/22
6810
如何使用Java进行加密和解密
url的加密解密_url地址加密
今天做项目构造链接参数的时候,推送到app上的链接点了没办法跳转到对应的界面 对比了一下能跳转的链接,原来是url没有加密,就推送过去了 在这里把对url加密解密的方法记录一下,方便以后使用
全栈程序员站长
2022/11/17
2.6K0
加密-解密详解
参考视频: https://www.bilibili.com/video/BV1tz4y197hm
用户5927264
2020/07/30
2.8K0
git 删除文件后如何恢复[通俗易懂]
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步
全栈程序员站长
2022/09/23
2.5K0
AES加密/解密
AES加密/解密算法是一种可逆的对称加密算法,这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,一般用于服务端对服务端之间对数据进行加密/解密。它是一种为了替代原先DES、3DES而建立的高级加密标准(Advanced Encryption Standard)。
arnodev
2022/10/21
8.5K0
加密Excel解密
excel文件进行加密,能够保护excel文件的内容,但是有时候我们自己设置的密码,时间久了可能会忘记,或者在网上下载的excel文件或者同事之间转发的excel文件也有加密,这对于我们来说都不是很方便了。
全栈程序员站长
2022/09/15
3.6K0
加密Excel解密
图片加密解密
创建java项目 运行java main,会在图片路劲下生成加密后的图片 package com.example;
全栈程序员站长
2022/08/31
1.9K0
python 加密解密
MD5   import hashlib   c = raw_input('输入字符:') #python3为input b = hashlib.md5()   b.update(c.encode(encoding='utf-8'))   print ('MD5加密前:'+ c)   print ('MD5加密后:'+b.hexdigest())
py3study
2020/01/02
3.4K0
matinal:ABAP 字符串的 Base64 加密和解密
matinal
2023/10/14
3460
namenode出现故障后,如何恢复??
secondaryNamenode对namenode当中的fsimage和edits进行合并时,每次都会先将namenode的fsimage与edits文件拷贝一份过来,所以fsimage与edits文件在secondarNamendoe当中也会保存有一份,如果namenode的fsimage与edits文件损坏,那么我们可以将secondaryNamenode当中的fsimage与edits拷贝过去给namenode继续使用,只不过有可能会丢失一部分数据。这里涉及到几个配置选项 namenode保存fsimage的配置路径
用户4870038
2021/02/05
9670
Mysql加密解密
https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_aes-encrypt
mingjie
2022/05/12
5K0
java加密解密
1 package com.jetsum.util; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.IOException; 6 import java.security.InvalidAlgorithmParameterException; 7 import java.security.InvalidKeyException
landv
2018/05/24
6.9K0
点击加载更多

相似问题

加密后如何解密?

11

加密-解密是不可恢复的

18

加密和解密后字符串不再相等

21

加密/解密,解密时丢失部分加密字符串

24

AES加密/解密后缺少':‘

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文