RSA2加密解密原理分析
签名主要包含两个过程:摘要和非对称加密,首先对需要签名的数据做摘要(类似于常见的MD5)后得到摘要结果,然后通过签名者的私钥对摘要结果进行非对称加密即可得到签名结果。加密是为了防止信息泄露,签名是为了防止信息被篡改。
发送双方A-B 都有一套公钥和私钥,公钥拿对方的,私钥拿自己的。A发送消息给B时,用B的公钥进行加密,加密可以防止信息泄露。然后用自己的私钥签名,签名防止信息被篡改。B收到消息之后,用公钥进行验签,验证信息是否篡改,用私钥解密获取原始信息。
生成一个定长128位,不可逆的数字。同一个数据,两次摘要,结果必然相同。收集明文对应的摘要,则有很大机率破译。
摘要知识用于验证数据完整性和唯一性 。
指加密和解密用的不是同一套密钥。针对对称加密的缺点,而产生的非对称加密。通过公钥加密,则公钥任何人都可以获取,通过私钥解密,私钥只有自己拥有。
RSA2强制要求密钥长度为2048
RSA则推荐长度为2048
足够大的质数也是由对应的开源库随机产生
长度过短,则通过暴力破解的方式可以短时间内破解
而2048的长度依靠现在的算力至少需要300万亿年,当然量子计算机出现获取可以实现倒推明文
PKCS1 :里面包含了RSA加密、解密、签名验签等所有的内容,当然也包含了私钥的格式。
PKCS8:专门用来存储私钥的文件格式规范。
PKCS1优先于PKCS8出现,在当时RSA算是最先进的非对称加密技术。随着加密算法的发展才有了PKCS8出来专门做存储密钥这样一件事情
需要注意的是 Java中使用RSA私钥格式必须为PKCS8否则报错
algid parse error, not a sequence
Attach签名:其特点是将原文、签名证书、签名算法、签名数据 封装成签名结果。
Detached签名:签名证书、签名算法、签名数据 封装为签名结果
Raw签名: 只将签名数据封装成签名结果
国家自己研制出的一套加密算法。
假设要发送的一个字母c,为了方便计算我们用十进制,a就是1,b就是2,c就是3 …
假设公钥里是(7,33),私钥里是(3,33)。
我们对3^7%33 得到的9 就是密文。
拿到密文之后进行解密
解密和加密操作一样
我们对9^3%33 得到了 3 就是我们的明文数据了。
如图

通过刚刚的求幂和求余,应该大致了解了加密的过程,你一定很惊讶,也可以发现关键之处在于公钥和私钥。
下面聊一聊公钥私钥的制作过程
质数:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
互质是:公约数只有1的两个整数,叫做互质整数。公约数只有1的两个自然数,叫做互质自然数
任意两个质数构成的是互质关系。一个数是质数,另一个数只要不是前者的倍数,两只之间就构成互质的关系。如果两个数之间叫大的书是质数,则两者构成互质关系。
欧拉函数:在数论,对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目(因此φ(1)=1)。 例如φ(8)=4,因为1,3,5,7均和8互质。
因为质数,除了1和它本身以外不再有其他因数的自然数,那么质数的欧拉函数就是本身减一
φ(5)=sum(1,2,3,4)=(5-1)=4

通过上面分析,了解了公钥私钥的生成方式,得出要想的到私钥,就要倒退得到 E,T,N。其中非常关键的一个地方就是第三步的欧拉函数。我们可以尝试再往下聊聊欧拉函数。
说到欧拉函数,就必须要说到一个人,皮埃尔·德·费马
费马提出过一个 费马小定理
如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。
a^(p-1)≡1(mod p)就是说a的p-1次幂和1对于p求余结果相等。
费马很调皮,只是给出了结论,然后说字不够了,让大家去证明。
接下来主角出现,欧拉,欧拉在证明费马的话时,发现确实成立。但是不够广泛,因此就想能不能扩大一下要求的范围,后来发现,a和p只要都是整数,且互质就可以满足这个定理。证明过程如图


证明过程中用到φ(m*n)=φ(m)*φ(n),是因为欧拉函数还是一个积性函数,可以自行证明
本文仅仅简单介绍了RSA2相关的名词和基本运算规则,使用RSA2加密能使我们安全的进行数据的传输。
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
我认为我知道如何创建自定义的加密RSAkey,但我如何才能像ssh-keygen那样读取一个加密的key?我知道我可以做到:OpenSSL::PKey::RSA.new(File.read('private_key'))但是OpenSSL要求我提供密码...我如何将它作为参数传递给OpenSSL?而且,我如何创建一个与ssh-keygen生成的兼容的?我做这样的事情来创建私有(private)加密key:pass='123456'key=OpenSSL::PKey::RSA.new(1024)key="0000000000000000#{key.to_der}"c=OpenSSL::C
我正在考虑使用attr_encrypted在Rails应用程序中用于字段级加密的gem。如何生成用于此gem的加密key?更新:Encryptor的文档,它是attr_encrypted使用的底层加密,声明如下(在Usage|Basic下):secret_key=Digest::SHA256.hexdigest('asecretkey')encrypted_value=Encryptor.encrypt('somestringtoencrypt',:key=>secret_key)我猜想key可以是任意长度的随机字符串,而对hexdigest的调用将从中计算出适当的固定长度字符串。这是
我有一个pgp加密文件,我需要在运行时从中提取数据。这可以通过仅解密到内存来完成吗(而不是创建解密文件并在完成后将其删除)? 最佳答案 名为OpenPGP的Ruby库几个月前发布。看起来它对你有用。 关于ruby-在Ruby中访问pgp加密文件,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1083546/
2022年10月21日星期五【数据指标】加密货币总市值:$0.95万亿BTC市值占比:38.51%恐慌贪婪指数:23极度恐慌 【今日快讯】1、【政讯】1.1.1、美联储布拉德:市场预期美联储11月会加息75个基点1.1.2、美联储哈克:将维持加息一段时间1.2、美国10年期国债收益率触及4.197%,为2008年6月以来最高1.3、法国数字转型部长:政府将专注于DeFi和Web31.4、巴西ATM机将于11月3日起支持USDT1.5、美众议院副议长将于11月初加入a16zCrypto担任政府事务主管1.6、香港数字资产托管机构FirstDigitalTrust首席执行官:香港仍是安全