Тип получателя метода должен быть указателем, если вы хотите, чтобы этот метод изменил состояние получателя.
То есть так же, как вы объявили метод growOld
, метод tellDogToGrowOld
также должен иметь приемник указателей:
func (owner *Owner) tellDogToGrowOld() {
owner.dog.growOld()
}
В качестве альтернативы, вы можете сделать поле, хотите изменить указатель, например:
type Owner struct {
dog *Dog
}
func newOwner(dog *Dog) Owner {
var owner Owner
owner.dog = dog
return owner
}
func (owner Owner) tellDogToGrowOld() {
owner.dog.growOld()
}
Это зависит от crypto системы.
В RSA мы имеем (цитирование Википедии):
Открытый ключ состоит из модуля n и общественности (или шифрование) экспонента e. Закрытый ключ состоит из модуля n и частного (или дешифрование) экспонента d, который должен держаться в секрете.
Теперь, если у нас есть n и d (закрытый ключ), мы только пропускаем e для открытого ключа. Но e является часто довольно маленьким (меньше чем три цифры), или даже зафиксированный (общая ценность 65537). В этих случаях, получающих открытый ключ, тривиально.
Для Эллиптической кривой Diffie-Hellman закрытый ключ является d и открытым ключом dG (с G также общественность), таким образом, это тривиально также.
В ЛЮБОМ открытом ключе crypto система открытый ключ математически связан с закрытым ключом. Это очень просто.
Открытый ключ получен из закрытого ключа во время поколения, и с закрытым ключом в будущем возможно повторно получить открытый ключ легко.
Не выполнимо пойти другим путем. Учитывая открытый ключ не легко получить закрытый ключ. Вот почему мы можем безопасно совместно использовать открытые ключи с другими людьми. Если у Вас есть циклы достаточного количества времени/ЦП, Вы могли скот вызывать его, но, вероятно, легче ожидать математического нападения на ключ.
Да с доступом к закрытому ключу открытый ключ может быть сгенерирован
Это теоретически возможно, но для больших ключей, в вычислительном отношении неосуществимых.
Это зависит от алгоритма, и что Вы подразумеваете под "закрытым ключом".
Закрытые ключи RSA часто хранятся в их "китайской форме" Теоремы Остатка. Например, RSAPrivateKey
структура, определенная в № 1 PKCS и снова использованная многими другими crypto стандартами, принимает эту форму. Эта форма включает два секретных числа, часто обозначаемые p
и q
, из которого вычисляется тотиент. С тотиентом и частной экспонентой, быстро вычисляется общедоступная экспонента.
В любом случае большинство пар ключей RSA использует 65537 в качестве общедоступной экспоненты, и модуль всегда несут как часть закрытого ключа.
В большинстве реализаций асимметричных криптосистем гарантируется только то, что вы не можете найти закрытый ключ из открытого ключа. Наоборот, найти открытый ключ из закрытого в большинстве случаев тривиально.
Например, в RSA вы можете создать открытый ключ из закрытого ключа с помощью:
openssl rsa -in private.pem -pubout -out public.pem
Что вводит в заблуждение, так это терминология: "закрытый" key "относится к двум различным концепциям, говорите ли вы о теории или о практической реализации:
0x10001
, хотя его можно изменить , настоятельно рекомендуется придерживаться только очень конкретных значений ). Таким образом, получение открытого ключа (e, n) из закрытого ключа тривиально по нескольким причинам.