2012-02-21 134 views
-1

有关证书和密钥的Apple文档说明可以将公钥发送给其他用户。这当然是他们的观点。在中间人攻击中,不要陷入关于人的侧线,我想知道这应该如何工作。交换公钥

我使用base64编码在设备之间的电子邮件中发送公钥。抵达后,他们不工作,并且当我尝试使用它们时,接收应用程序会抛出异常。 base64代码和密钥生成和检索代码已经在另一个应用程序中进行了详尽的测试,并且可以工作。这里是一个简单的问题:

(1)所有的关键API使用SecKeyRef键。

(2)SecKeyRef明显包含指针,它与不同的位每次我从钥匙串检索密钥对时间出来在某些偏移

(3)如果我检索密钥作为CFDataRef,这应该为了“平坦”,我得到了一个截然不同的野兽,总是具有相同的值,还有很多零填充(base64中的大写A)。

(4)进口CFDataRef不起作用

我不没有做大量的调查研究问这个,阅读和测试,我承认我很为难,没有人知道如何交换公共钥匙?我已经写了Windows应用程序多年,这样做。证书链是我需要在这里完成的一个非常大的锤子。

谢谢。

回答

0

这似乎是一个困惑的问题。你在问公钥交换是如何工作的,或者你为什么不能将内存中的对象转移到另一台没有指针断开的机器上。

第一个问题的答案是,您只需传输公钥 - 这是一系列字节,通常是十六进制或base64编码或包装在X509(ASN1)证书内。公钥本身告诉其他用户足够的信息,他们可以将任何字节流加密成可以由持有私钥的人解密的东西。因此,公开密钥的传输可以通过简单的方式进行。

公钥密码学唯一的安全弱点就是如果攻击者可以在公钥传输和密文中进行中间人攻击。如果A希望转移到B,并且M可以看到并修改两者之间的所有流量,那么M可以简单地假装为B,安全地连接到A,然后可以解密A试图发送给B的内容。通过对称性,他可以做到与B相同,因此双向通道被破坏。

SSL通过使用信任链验证来打败这种理论攻击,确保M无法假装为B,即使B不为A所知,因为B可以依靠某些共享的第三方来证明自己的身份(CA)。这就是为什么最近对Diginotar和Comodo的攻击如此严重。加密是安全的,但身份验证不是。

所以简而言之,答案就是您只需传输密钥。公钥不需要安全地传输给他们工作,但是如果你没有某种预先共享的秘密或者某种连锁信任,那么你就会自己开放,中等解密攻击。

+0

你显然没有看完我的问题,并给出了完全正切的答案。我的问题在于密钥的传输,我详细解释了这些密钥。 – 2012-03-11 15:22:10

+0

我从那以后发现了一个使用CFDataRef密钥版本的解决方案,它涉及将它们导入到钥匙串中;仅仅将它们解码为原始位的行为是不够的。但是我放弃了这个项目,因为我不喜欢追求政府执照的麻烦,因为我住在越南。 – 2012-03-11 15:25:59