使用 Diffie Hellman 密钥交换和椭圆曲线加密进行快速加密

2024-01-01

我一直在尝试使用 Diffie Hellman 密钥交换和椭圆曲线加密快速加密和解密字符串。

以下是我遵循的代码。

SWIFT代码 :

 let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 256,
                                     kSecAttrKeyType as String: kSecAttrKeyTypeEC,
                                     kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false]]
 var error: Unmanaged<CFError>?
 if #available(iOS 10.0, *) {
 **// Step 1:  Generating the Public & Private Key**
        guard let privateKey1 = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {return false}

        let publicKey1 = SecKeyCopyPublicKey(privateKey1)
        guard let privateKey2 = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {return false}

        let publicKey2 = SecKeyCopyPublicKey(privateKey2)

        let dict: [String: Any] = [:]
 **// Step 2:  Generating Shared Key**   
        guard let shared1 = SecKeyCopyKeyExchangeResult(privateKey1, SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256, publicKey2!, dict as CFDictionary, &error) else {return false}

**// Step 3:  Encrypt string using Sharedkey**
        let options: [String: Any] = [kSecAttrKeyType as String: kSecAttrKeyTypeEC,
                                      kSecAttrKeyClass as String: kSecAttrKeyClassPrivate,
                                      kSecAttrKeySizeInBits as String : 256]
        // Stuck from this line on
        guard let key = SecKeyCreateWithData(shared1 ,
                                             options as CFDictionary,
                                             &error) else {return false}
        print(key)


        let str = "Hello"
        let byteStr: [UInt8] = Array(str.utf8)
        let cfData = CFDataCreate(nil, byteStr, byteStr.count)


        guard let encrypted = SecKeyCreateEncryptedData(publicKey1!,
                                                        SecKeyAlgorithm.ecdsaSignatureDigestX962SHA256,
                                                        cfData!,
                                                        &error) else {return false}
        print(encrypted)

    } else {
        print("unsupported")
    }

JAVA代码:

public static Map<String, Object> ecEncrypt(String deviceData, String serverPubKey, String dsTranID)
throws DataEncryptionException {
provider = new BouncyCastleProvider();
HashMap<String, Object> result = null;
JWEObject jweObject = null;
JWK jwk = null;
SecretKey Z = null;
JWEHeader header = null;
ECPublicKey ecpubkey = null;
byte[] byte_pubkey = null;

try {

result = new HashMap<String, Object>();
/*
 * Generate Ephemeral keypair for SDk which constitute Public and
 * Private key of SDK
 */
STEP 1:
sdkKeyPair = Crypto.generateEphemeralKeyPair();

/*
 * Compute Secrete Key Z from SDKs Private Key(pSDK),DS Public
 * key(serverPubKey) and DS ID
 */
//converting string to Bytes
STEP 2:
byte_pubkey = Base64.decode(serverPubKey, android.util.Base64.DEFAULT);

//converting it back to EC public key
STEP 3:
KeyFactory factory = KeyFactory.getInstance("ECDSA", provider);
ecpubkey = (ECPublicKey) factory.generatePublic(new X509EncodedKeySpec(byte_pubkey));
System.out.println("FINAL OUTPUT" + ecpubkey);

STEP 4:
Z = Crypto.generateECDHSecret(ecpubkey,
(ECPrivateKey) sdkKeyPair.getPrivate(), dsTranID,
"A128CBC_HS256");

System.out.println("****Secrete key Z for SDK Computed succesfully *****");
/*
 * Build JWK to construct header
 */
STEP 5:
jwk = new ECKey.Builder(Curve.P_256,
(ECPublicKey) sdkKeyPair.getPublic()).build();

STEP 6:
header = new JWEHeader.Builder(JWEAlgorithm.ECDH_ES,
EncryptionMethod.A128CBC_HS256).ephemeralPublicKey(
ECKey.parse(jwk.toJSONString())).build();

System.out.println("****Header for SDK Computed  succesfully*****");

/*
 * Add Header and payload before encrypting payload using secret key
 * Z
 */

STEP 7:
jweObject = new JWEObject(header, new Payload(deviceData));
jweObject.encrypt(new DirectEncrypter(Z));
/*
 * serialize JWEobject which contains
 * [header-base64url].[encryptedKey
 * -base64url].[iv-base64url].[cipherText
 * -base64url].[authTag-base64url]
 */
System.out
.println("****Payload of SDK encrypted succesfully *****");

return result;
} catch (Exception e) {
e.printStackTrace();
throw new DataEncryptionException();
} finally {
sdkKeyPair = null;
jweObject = null;
jwk = null;
Z = null;
header = null;
}
}

我还包含了 Java 代码。我必须在 Swift 中做同样的事情。如何使用共享密钥(Shared1)进行EC加密来加密字符串?我需要执行第 3 步。有人可以帮忙吗?


首先,您正在尝试实施 ECIES。如果您想查找有关该方案的信息,了解实际名称很重要。

因此,我们假设密钥对 1 来自密文的发送者,密钥对 2 来自密文的接收者。在这种情况下,密钥对 1 应该是临时的(当场创建,与一条加密消息绑定),而密钥对 2 是静态的(预先创建并保留)。此外,公钥 2 被信任来自接收方。从您的简化代码中,这一切都不清楚,并且在您的代码中您仍然可以切换发送者和接收者。

因此,通过接收者的公钥(2),发送者可以使用他们的私钥来创建一个共享秘密,称为shared1在你的代码中。您现在可以使用shared1对数据进行对称加密。然后您只需将发送方的临时公钥和密文发送给接收方即可。接收方使用发送方的公钥 (1) 及其静态私钥 (2) 来创建shared2。这与shared1因此可以用作解密数据的密钥。

就是这样,除了注意由于发送者的私钥 (1) 与数据绑定在一起之外,一旦发送就不再需要它了shared1被计算出来,甚至在消息被加密之前就可能被丢弃。


如果您阅读了上面的内容,您就会发现将所有这些都放在一种方法中并不是一个好主意:

  1. 创建接收者的静态密钥对;
  2. 将接收者的公钥发送给发送者,并确保发送者可以信任来自接收者的公钥(例如使用证书基础设施);

现在进行加密和发送:

  1. 创建发送者的密钥对;
  2. 导出对称密钥;
  3. 扔掉私钥;
  4. 加密数据;
  5. 发送公钥和数据;

对于接收:

  1. 使用私钥导出对称密钥;
  2. 解密数据。

就是这样。您可能想要执行这些步骤explicit在你的代码中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Diffie Hellman 密钥交换和椭圆曲线加密进行快速加密 的相关文章

  • 将对象映射到 TableView 部分的 Swift 二维数组

    我想不出更好的方法来做到这一点 我将学生对象的所有属性映射到二维数组中 所以我的电视有几个部分 我也不能使用静态表视图 如果是这样 这个问题就不会存在 所以我在 TVC 中的代码 let currentUser PFUser current
  • 文档 Main.storyboard 需要 Xcode 8.0 或更高版本

    我下载了 Xcode beta 并打开了现有的项目 看看它如何与 Xcode 8 beta 一起使用 我从 Xcode 8 打开了 Storyboard 文件 现在 当我从 Xcode 7 3 打开项目时 我无法打开故事板文件 它给出了以下
  • 如何在 macOS 上的 SwiftUI 中设置拖动图像

    我正在尝试更改 GridView 的默认拖放预览图像 该图像似乎包含网格中的所有可见项目 据我了解 我应该能够设置NSItemProvider previewImageHandler块来自定义所使用的图像 我似乎找不到任何关于返回自定义图像
  • 使用 AVFoundation 和 Swift 访问多个音频硬件输出/通道

    如何使用 AVFoundation 访问除 1 2 之外的其他音频硬件输出 我正在为 Mac OS X 应用程序编写快速代码 该应用程序通过各种输出设备 USB 接口 dante soundflower 播放 mp3 文件 如下所示 myP
  • 锁定时 AVAudioPlayer 在 iPhone 5 中不播放音频

    使用 AVAudioPlayer 我尝试在 iphone 播放器播放时播放声音 当设备锁定时也是如此 问题是 在 iPhone 4s ios 7 中 效果很好 但在带有 6 和 7 ios 的 iPhone 5 上没有任何反应 In the
  • iOS - 基于设备的不同图像或缩放相同的图像?

    似乎开发人员总是为不同的设备创建不同的图像资源 并根据设备加载它们 但是 只为最高分辨率的设备 iPad 创建图像 然后为 iPhone 6 5 等缩小该图像 有什么缺点吗 我使用 SpriteKit 因此我只需创建不同大小的 SKSpri
  • 如何在 UINavigationController 中收到弹出视图的通知?

    我想在用户按下我的后退按钮时执行操作UINavigationController当到达某个时UIViewController 不幸的是它看起来像UINavigationControllerDelegate没有任何方法来获取视图弹出的通知 作
  • Objective C - 动态属性的respondsToSelector

    我目前面临的问题是检查对象 NSManagedObject 的属性是否存在 不幸的是方法 MyObject class respondsToSelector selector myProperty 总是返回NO 我认为这是因为CoreDat
  • 如何让我的“点击”功能与 iOS 配合使用

    我有一组充当按钮的 Div 这些按钮有一个简单的 jquery click 函数 该函数适用于除 iOS 之外的所有浏览器 例如 div class button click me div and button click function
  • iPhone X 上横向的 UICollectionView

    当 iPhone X 横向使用时 您应该检查 safeAreaInsets 以在左侧和右侧制作适当大的装订线 UITableView 有新的insetsContentViewsToSafeArea属性 默认 true 自动将单元格内容保留在
  • Xcode 8.2 更新后二进制文件无效

    我今天尝试在更新到 Xcode 8 2 后向我的应用程序推送更新 但收到无效的二进制错误 我以前从未见过这个 我的应用程序的 iOS 部署目标是 iOS 9 0 有谁见过这个错误或知道如何修复它 这是电子邮件的内容 解释了二进制文件的无效内
  • 在 iOS 中获取 Facebook 好友时出错

    我正在尝试获取登录用户的 Facebook 好友列表 它在我的帐户中工作正常 但是当我将应用程序详细信息迁移到新帐户并更改应用程序 ID 和应用程序密码时 我收到以下错误 Error Domain com facebook sdk Code
  • iOS 应用程序崩溃 com.apple.root.background-qos

    在应用程序中发现应用程序崩溃 我怀疑这可能是由于 firebase 观察者的代码而发生的 由于在用户案例中 用户可以从一个事件转到用户配置文件 参与此事件 然后从用户配置文件可以返回到此事件 我需要一个 ref 句柄来删除特定的观察者 因此
  • 如何在 Swift 中更改 UIButton 图像

    我正在尝试使用 Swift 更改 UIButton 的图像 我应该怎么办 这是 OBJ C 代码 但我不知道 Swift 的情况 playButton setImage UIImage imageNamed play png forStat
  • 理解 UIViewRepresentable

    斯威夫特 5 0 iOS 13 尝试了解 UIViewRepresentable 的工作原理 并将这个简单的示例放在一起 几乎就这样了 但也许完全是无稽之谈 是的 我知道 SwiftUI 中已经有一个 tapGesture 这只是一个测试
  • 电话号码的 Swift 2 国家/地区代码

    我正在尝试从 iPhone 用户处获取国家 地区代码 我不确定是否有有关该国家 地区以及某些应用程序 如 Viber 如何建议拨号代码的信息 我到目前为止 let currentLocale NSLocale currentLocale l
  • 在 ios 中从 XMPP 服务器检索存档的消息

    我正在将 XMPP 功能集成到我的 ios 应用程序中 但遇到了一个无法解决的问题 问题是我无法从服务器获取存档的消息 我的客户能够登录 并且我已经成功测试了多个服务调用 发送 接收消息 获取有关用户的信息 发送后
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • JavaScript 与 WKWebView 的同步本机通信

    使用 WKWebView 可以在 JavaScript 和 Swift Obj C 本机代码之间进行同步通信吗 这些是我尝试过但失败的方法 方法 1 使用脚本处理程序 WKWebView接收JS消息的新方式是使用委托方法userConten
  • iOS 13 UIActivityViewController 在图像保存后自动呈现以前的 VC

    我正在尝试实现 将图像保存到库 功能 然后返回到当前视图控制器 但在新的 iOS 13 上 它会返回到呈现当前视图控制器的视图控制器 PHPhotoLibrary requestAuthorization status PHAuthoriz

随机推荐

  • jest 无法识别 URL 构造函数抛出的 TypeError

    Jest toThrow TypeError 与抛出的 TypeError 不匹配new URL构造函数 这是一个错误还是我做错了什么 笑话版本是29 4 2 测试用例 it throws TypeError when url is inv
  • JavaFX ContextMenu 如何获取单击的对象?

    我正在学习 javafx scene control ContextMenu 现在我面临一个问题 如何从 EventHandler 获取单击的对象 event source 和 event target 都返回 MenuItem 让我用一个
  • 使用 Valgrind 运行时 mmap 返回 EINVAL

    我针对 Valgrind 运行的 mips32 应用程序在 mmap 函数中失败 如果我单独运行它工作正常 但是当我针对 valgrind 运行它时 它每次都会失败并显示 EINVAL void mem uint32 t mmap NULL
  • Write系统调用直接将数据写入磁盘?

    我读过几个问题 here https stackoverflow com questions 1450551 buffered i o vs unbuffered io 与此相关 但我仍然有些困惑 我的理解是 write 系统调用将数据放入
  • lucene如何索引文档?

    我读了一些关于Lucene的文档 我还阅读了此链接中的文档 http lucene sourceforge net talks pisa http lucene sourceforge net talks pisa 我不太明白Lucene是
  • 针对写入量大的 Oracle 应用程序进行优化?

    对于主要写入 更新 Oracle 数据库的应用程序 可以使用哪些有用的 Oracle 优化 这里的一般使用模式不是像大多数情况那样进行网络服务或日志记录 而是保存系统的复杂状态 因此唯一需要读取的时间是系统启动时 之后更新并创建所有方式 因
  • 在 Android 上使用选定的 UID 模拟 NFC 卡

    我想问 2 个关于 NFC 卡模拟的问题 我可以模拟包含我选择的 uid 的 NFC 卡吗 I read HCE https developer android com guide topics connectivity nfc hce h
  • cuda内核调用是同步还是异步

    我读到可以使用内核启动来同步不同的块 即 如果我希望所有块在继续操作 2 之前完成操作 1 我应该将操作 1 放在一个内核中 将操作 2 放在另一个内核中 这样 我就可以实现块之间的全局同步 然而 cuda c 编程指南提到内核调用是异步的
  • 对url中的中文字符进行转义?

    有时 汉字会转义为以下形式 B9 F3 D6 DD C3 A9 CC A8 如何将这些字符转换回 Python 中可读的汉字 您可以使用urllib2 unquote像这样 gt gt gt import urllib2 gt gt gt
  • Spark 中的简单矩阵乘法

    我正在努力处理一些非常基本的 Spark 代码 我想定义一个矩阵x有 2 列 这是我尝试过的 scala gt val s breeze linalg linspace 3 3 5 s breeze linalg DenseVector D
  • 为什么按位“非1”等于-2?

    假设我们有1这个以 2 为基数的数字是 00000000000000000000000000000001 现在我想翻转所有位以获得以下结果 11111111111111111111111111111110 据我所知 解决方案是使用 按位非运
  • 如何在2个线程之间共享变量

    Using Python 2 7 3 on Windows 我如何共享变量num线程之间 这样 之后num是平方的 是打印出来的 我意识到我需要了解线程是如何工作的 但是文档没有太多 而且我在这里也没有找到任何东西 那么 有人可以解释线程如
  • 为什么 NodeJS 比原生 C 快 2 倍?

    为了在工作中进行演示 我想比较 NodeJS 和 C 的性能 这是我写的 Node js for js var d 0 0 start new Date getTime for var i 0 i lt 100000000 i d i gt
  • C标准库中realloc是如何实现的?

    我找不到任何源代码realloc函数 它似乎打破了 C 的基本规则 它不需要重新分配内存的长度 在不知道原始内存长度的情况下如何重新分配内存 我自己如何实现这个功能呢 至少有 3 个考虑因素使得实施变得困难或不可能realloc完全在 用户
  • MongoDB,有条件的更新插入或更新

    使用 MongoDB 时 我目前正在表单上进行条件更新插入 作为聚合过程的一部分 简化了很多 db dbname update attr1 value1 attr2 value2 inc avg current value nr 1 fal
  • Plotly:如何在 Excel 中嵌入完全交互式的 Plotly 图形?

    我正在尝试将交互式绘图 或散景 图嵌入到 Excel 中 为此 我尝试了以下三件事 将 Microsoft Web 浏览器用户窗体嵌入到 Excel 中 如下所示 如何在 Excel VBA 表单中嵌入浏览器 https stackover
  • SQLite WHERE 子句中的 if 语句

    我知道我可以在 SQLite 查询中使用 CASE 语句 但我不知道如何在 WHERE 子句中构建它 实际上我在一个很长的 WHERE 子句中有这个 这只是问题所涉及的部分 AND d gt wines year wines maturit
  • 设备无关像素有什么优点?

    我正在学习WPF WPF 使用与设备无关的像素 但我实在无法理解他们 如果大多数其他应用程序都依赖于设备而 WPF 应用程序不是 为什么它们比依赖于设备的像素更好 他们会脱颖而出吗 设备独立像素的优点是 在指定 UI 时 您可以确定 UI
  • “混蛋注射”和“穷人注射”之间的真正区别是什么

    来自 NET 中的依赖注入 https manning com seemann书上我知道对象图应该创建在Composition Root当您使用该应用程序时 这对我来说很有意义IoC Container 在我见过的所有应用程序中 当尝试使用
  • 使用 Diffie Hellman 密钥交换和椭圆曲线加密进行快速加密

    我一直在尝试使用 Diffie Hellman 密钥交换和椭圆曲线加密快速加密和解密字符串 以下是我遵循的代码 SWIFT代码 let attributes String Any kSecAttrKeySizeInBits as Strin