沿着一条线找到随机点

时间:2009-02-28 09:27:21

标签: c# .net encryption geometry

我正在编写一个小程序来帮助分割密码(请参阅下面的说明)

我有将代码转换为int的代码(text-ascii binary - > dec int)

所以在这种情况下,“test”一词将= 1952805748

现在有趣的部分。(编码密码)

然后我将x1 = 1952805748和y1 = 0

然后我组成一个随机点,其中x2 = 7,y2 = 142

这将在x1,y1和x2,y2之间画一条线(使用Y = mx + B)

我需要如何在这两个点创建的线上找到任何随机点(好好称之为x3,y3)

如果有人有任何想法我会很乐意听到他们。我试图计算出两个点都是整数的代码(如果我们每个数字后面没有巨大的小数点,那么每个人都会更容易)

++为什么++

一般的想法是,如果你必须在双方之间分开密码,那么一方可能会根据给出的字符串找出密码

如果你使用这种方法,他们会得到一个单独的点,从那个单点,在数学上不可能确定线符合x的位置(x =?y = 0) 所以你可以安全地将一套积分交给你的律师,一个给你的妻子

他们会做数学计算(将其输入程序)然后他们会得到一个可以解码的数字来说明一个密码可以用你的遗嘱或其他一些你不希望他们访问的敏感文件来破坏文件出于另一个预见的

5 个答案:

答案 0 :(得分:8)

其他答案已经解决了您的数学思想,但在加密方面,我会强烈建议您不要尝试制定自己的加密方案。

如果你想用两个密码来加密某些东西,这两个密码都是必要的,那么有一个更简单的方法:加密文件两次:

Plaintext -> Encrypted1 (with password 1)
Encrypted1 -> Encrypted2 (with password 2)

Encrypted2就是您存储的内容。丢掉Encrypted1

要解密,只需使用密码2解密Encrypted2即可获得Encrypted1,然后解密Encrypted1以返回明文。

任何一个密码本身都没用,就像预期一样,而且你不需要计算任何加密算法/代码。

编辑:作为一个更简单的解决方案,只需填写一个非常长的密码,并给每一方提供一半的密码。例如,使用密钥“这是一个非常长的密码”加密文件,并给你广泛的“这是一个非常”和你的律师“长密码”。显然你需要适当地选择密码,以便知道一半不会给出关于另一半的任何提示。

答案 1 :(得分:6)

这个算法实际上叫做“Shamir's Secret Sharing”,是分裂秘密的一种非常好的方法。你可以分开任意大的秘密,这些秘密需要你想要聚集在一起的人数来恢复这个秘密。

我建议你略微概括并找到一个解决方案,让你指定N点需要求解N-1次多项式。您可以使用Lagrange Polynomials为您解决此问题。

然而,维基百科上的伪代码仅适用于浮点数,并且需要稍微修改才能与整数一起使用。 Check out my full python implementation如果你想要一些想法(并假设它有用)。

它给了我这个输出:

1 -- 50383220533284199945706810754936311181214547134666382315016772033813961148457676
2 -- 125723425896904546349739165166331731432281836699962161072279259011758052396215820
3 -- 235794378436564714387676526976517945151880763730707233042654663244625708155520494
'This is my super secret password.'

编辑: 一年后,我已将实施更新为在有限字段内工作,这是证明其可靠性所必需的。万岁!

答案 2 :(得分:4)

如果你的端点是(x1,y1)和(x2,y2)并且你有一个随机数r int,范围是0到1,那么沿着这一行的点将是:

(x1+(x2-x1)*r,y1+(y2-y1)*r)

对于给定的端点(1952805748,0)和(7,42),随机值为0.5(沿着线的中间),您最终得到:

(976402877.5,21)

您可以轻松地将其作为中点。如果需要整数,可以对任何坐标进行舍入。

发表评论(转述):

I may not have explained this properly: one person would be given (x1,y1) different person would be given (x3,y3). At no point would a person be able to take a single point and figure out where the line crosses x (N,0).

鉴于你的(x1,y1)是(1952805748,0),谁知道x轴的交点(因为y = 0)。听起来你想要沿线的两个点,它们都不在x轴上。这意味着一方应该给你随机选择的终点(7,42),另一方你的随机点就行(976402877.5,21) - 这些点都不应该是y值为零。这可以通过确保随机值在.2到1.0而不是0.0到1.0的范围内来实现(假设你的y1总是为0)。

任何一方都不能确定x轴与它们的一个坐标相交,但两个坐标组合会给你这些信息。

此外,在这种情况下,舍入或纵坐标将不合适,您必须映射它们,例如(976402877.5,21)变为(1952805755,42)[乘以2,这是最简单的整数比率]。

答案 3 :(得分:2)

//Assume x1, x2, and m, b exist as ints
Random r = new Random();
int x3 = r.Next(Math.Min(x1, x2), Math.Max(x1, x2));
int y3 = m * x3 + b;

基本上,我们在两个x之间选择一些x(保证正确的域,并通过线性函数的约束,正确的范围)并为y求解。不太难。

答案 4 :(得分:1)

人们不必解决一些未知的坐标。只需将加密文件插入序列号生成器即可。您已经多次有效地降低了强制加密的复杂性。而不是每个字符是~94的1(标准键盘上的可打字字符),你已经将它减少到十分之一(如果允许小数,则将其减少到十一)。

我会反对这种方法。正如Skeeter所说,只需加密文件两次。