- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在下面的代码中(也在 http://play.golang.org/p/77fRvrDa4A 但在浏览器中“处理时间太长”)sourceText 的 124 字节版本不会加密,因为:“消息太长对于 1024 位的 RSA 公钥大小。它和更长的 124 字节 sourceText 版本,使用 2048 位 key 大小。
我的问题是如何根据源文本的字节长度准确计算 rsa.GenerateKey 中的 key 大小? (一小段文本在 4096 键大小下需要将近 10 秒,而且直到运行时我才知道 sourceText 的长度。)
https://stackoverflow.com/a/11750658/3691075 对此进行了非常简短的讨论。 ,但我不清楚,因为我不是加密专家。
我的目标是加密、存储在数据库中并解密大约 300 字节长的 JSON 字符串。我控制发送端和接收端。文本加密一次,解密多次。任何策略提示将不胜感激。
package main
import (
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"fmt"
"hash"
"log"
"time"
)
func main() {
startingTime := time.Now()
var err error
var privateKey *rsa.PrivateKey
var publicKey *rsa.PublicKey
var sourceText, encryptedText, decryptedText, label []byte
// SHORT TEXT 92 bytes
sourceText = []byte(`{347,7,3,8,7,0,7,5,6,4,1,6,5,6,7,3,7,7,7,6,5,3,5,3,3,5,4,3,2,10,3,7,5,6,65,350914,760415,33}`)
fmt.Printf("\nsourceText byte length:\n%d\n", len(sourceText))
// LONGER TEXT 124 bytes
// sourceText = []byte(`{347,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,65,350914,760415,33}`)
// fmt.Printf("\nsourceText byte length:\n%d\n", len(sourceText))
if privateKey, err = rsa.GenerateKey(rand.Reader, 1024); err != nil {
log.Fatal(err)
}
// fmt.Printf("\nprivateKey:\n%s\n", privateKey)
privateKey.Precompute()
if err = privateKey.Validate(); err != nil {
log.Fatal(err)
}
publicKey = &privateKey.PublicKey
encryptedText = encrypt(publicKey, sourceText, label)
decryptedText = decrypt(privateKey, encryptedText, label)
fmt.Printf("\nsourceText: \n%s\n", string(sourceText))
fmt.Printf("\nencryptedText: \n%x\n", encryptedText)
fmt.Printf("\ndecryptedText: \n%s\n", decryptedText)
fmt.Printf("\nDone in %v.\n\n", time.Now().Sub(startingTime))
}
func encrypt(publicKey *rsa.PublicKey, sourceText, label []byte) (encryptedText []byte) {
var err error
var md5_hash hash.Hash
md5_hash = md5.New()
if encryptedText, err = rsa.EncryptOAEP(md5_hash, rand.Reader, publicKey, sourceText, label); err != nil {
log.Fatal(err)
}
return
}
func decrypt(privateKey *rsa.PrivateKey, encryptedText, label []byte) (decryptedText []byte) {
var err error
var md5_hash hash.Hash
md5_hash = md5.New()
if decryptedText, err = rsa.DecryptOAEP(md5_hash, rand.Reader, privateKey, encryptedText, label); err != nil {
log.Fatal(err)
}
return
}
最佳答案
通常不会根据负载计算 RSA key 大小。人们只需要根据安全性(越大越好)和性能(越小越好)之间的折衷来选择一种 RSA key 大小。如果完成,请使用 hybrid encryption结合 AES 或其他对称密码实际加密数据。
如果有效负载不超过 300 字节并且您使用的是 OAEP(至少 42 字节的填充),那么您可以轻松计算最小 key 大小:
(300 + 42) * 8 = 2736 bit
这已经是一个合理大小的 key 。根据当今的规范,它提供了良好的安全性并且速度相当快。无需为此应用混合加密方案。
现在,您可能会注意到 key 大小不是 2 的幂。This is not a problem .但是,您应该使用 64 位倍数的 key 大小,因为处理器使用 32 位和 64 位基元进行实际计算,因此您可以提高安全性而不会降低性能。下一个这样的 key 大小是:
ceil((300 + 42) * 8 / 64.0) * 64 = 2752 bit
以下是一些实验结果,一些语言/框架接受(不是性能方面)作为 key 大小:
3
]在您决定使用某种特定的 key 大小之前,您应该检查是否所有框架都支持该大小。如您所见,结果差异很大。
我尝试用不同的 key 大小编写一些 key 生成、加密和解密的性能测试:512、513、514、516、520、528、544、576。因为我不知道任何去向,它会是很难把握好时机。所以我选择了 Java 和 Crypto++。 Crypto++ 代码可能有很多错误,因为 520 位和 528 位 key 的 key 生成比其他 key 大小快七个数量级,这对于小 key 大小窗口来说或多或少是恒定的。
在 Java 中, key 生成非常清楚,因为 513 位 key 的生成比 512 位 key 的生成慢 2-3 倍。除此之外,结果几乎是线性的。该图已标准化,整个 keygen-enc-dec 循环的迭代次数为 1000。
解密在 544 位(32 位的倍数)处略有下降。由于它是在 32 位 debian 上执行的,这可能意味着确实有一些性能改进,但另一方面,对于该 key 大小,加密速度较慢。
由于这个基准不是在 Go 中完成的,所以我不会就开销可以有多小给出任何建议。
关于encryption - Go中加密/解密的源文本、 key 大小关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30577630/
表架构 DROP TABLE bla; CREATE TABLE bla (id INTEGER, city INTEGER, year_ INTEGER, month_ INTEGER, val I
我需要拆分字符串/或从具有以下结构的字符串中获取更容易的子字符串。 字符串将来自 window.location.pathname 或 window.location.href,看起来像 text/n
每当将对象添加到数组中时,我都会尝试更新 TextView ,并在 TextView 中显示该文本,如下所示: "object 1" "object 2" 问题是,每次将新对象添加到数组时,它都会覆盖
我目前正在寻找使用 Java 读取网站可见文本并将其存储为纯文本字符串的方法。 换句话说,我想转换成这样: Hello stupid World进入“ Hello World ” 或者类似的东西 Un
我正在尝试以文本和 HTML 格式发送电子邮件,但无法正确发送正确的 header 。特别是,我想设置 Content-Type header ,但我找不到如何为 html 和文本部分单独设置它。 这
我尝试了上面的代码,但我无法绑定(bind)文本,我怎样才能将资源内部文本 bloc
我刚刚完成了 Space Shooter 教程,由于没有 GUIText 对象,所以我创建了 UI.Text 对象并进行了相应的编码。它在统一播放器中有效,但在构建 Web 应用程序后无效。我花了一段
我有这个代码: - (IBAction)setButtonPressed:(id)sender { NSUserDefaults *sharedDefaults = [[NSUserDefau
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我在将 Twitter 嵌入到我从 HTML 5 转换的 wordpress 运行网站时遇到问题。 我遇到的问题是推文不是我的自定义字体... 这是我无法使用任何 css 定位的 HTML 代码,我正
我正在尝试找到解决由于使用以下形式的代码而导致的冗余字符串连接问题的最佳方法: logger.debug("Entering loop, arg is: " + arg) // @1 在大多数情况下,
我写了这个测试 @Test public void removeRequestTextFromRouteError() throws Exception { String input = "F
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[文本],并且需要获取文本。字符串可能类似于:something &[text] &[text] everything &[text] 等
有没有办法将标题文本从一个词变形为另一个词,同时保留两个词中使用的字母?我看过的许多 css 文本动画大多是视觉的,很少有旋转整个单词的。 我想要做的是从一个词过渡,例如“BEACH”到“CHANGE
总结matplotlib绘图如何设置坐标轴刻度大小和刻度。 上代码: ?
我在容器 (1) 中创建了容器 (2)。你能帮忙如何向容器(1)添加文本吗?下面是我的代码 return Scaffold( body: Padding( padding: c
我似乎找不到任何人或任何人这样做过。我试图限制我们使用的图像数量,并想创建一个带有渐变作为其“颜色”的文本,并在其周围设置渐变轮廓/描边 到目前为止,我还没有看到任何将两者结合在一起的东西。 我可以自
我正在为视频游戏暗黑破坏神 2 使用 discord.py 构建一个不和谐机器人。其中一项功能要求机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但
我很难弄清楚如何旋转 strip.text theme 中的属性来自 ggplot2 .我使用的是 R 版本 3.4.2 和 ggplot2 版本 2.2.1。 以下是 MWE 的数据。 > dput
我是一名优秀的程序员,十分优秀!