Kas계정 프라이빗키는 발급받지 않는건가요?

const account = await caver.kas.wallet.createAccount()
을 통해 계정을 생성하면 아리와 같이 리턴받는 것으로 확인됩니다. 퍼블릭키는 발급받지만 프라이빗키는 어디서 알 수 있는건가요?

Account {
address: ‘0x4d6de1Fe6a281306C54AD81b79a0c137b13872DC’,
chainId: 1001,
createdAt: 1602124416,
keyId: ‘krn:1001:wallet:9c42dff5-d317-4abd-a7ab-576aad12ea07:account-pool:default:0x975fa77efbde347b0c471f0f29ba73c1281521f69485d650c8c10125e37b57fc’,
krn: ‘krn:1001:wallet:9c42dff5-d317-4abd-a7ab-576aad12ea07:account-pool:default’,
publicKey: ‘0x0433f1b15d33e821155988408e949d21d5bd0d053d9f2ed90f3df57e96f0ce7a766ba36617f43f2ad1e0f3caca5bdb431a88c51c1bdaab8dc781589b1658e646f1’,
updatedAt: 1602124416
}

안녕하세요.

KAS Wallet API에서 생성한 계정의 private key는 KAS Wallet API 서비스에서 관리되며 직접 접근하실 수 없습니다.
KAS Wallet API를 사용하여 트랜잭션에 서명하시면 됩니다.
자세한 내용은 문서의 javascript 탭을 참고해 주세요.

저희 서비스에서 퍼블릭키와 프라이빗키를 통해 파일을 암복호화 해줘야하는 기능이 있는데 그럼 kas를 이용해서는 다른 아이디어가 없는걸까요 ?

트랜잭션이 아닌 데이터에 서명하고자 하는 경우 caver.kas.wallet.signMessage 함수를 사용하여 데이터에 서명할 수 있습니다.

"hello world"라는 평문데이터를 A계정의 public key로 암호화를 하고 A계정의 private key로 복호화하여 A계정만 "hello world"를 볼 수 있도록 서비스하려 합니다. 그래서 계정을 생성할 때 public key와 private key를 모두 발급 받아야 하는 상황입니다. KAS에서는 불가능 하다면 다른 방법이라도 있을까요? 아니면 KAS내에 해당 기능을 대신해주는게 있는지 여쭙니다.

일단 결론적으로 말씀을 드리면, KAS 로는 힘든 상황입니다. 조금더 상세하게 설명드리면 아래와 같습니다.

현재 클레이튼에서 사용하고 있는 공개키/개인키 쌍은 EC (타원곡선암호) 상에서의 키를 사용하고 있습니다.
그리고 일반적으로 서명을 위해서는 ECDSA 를 사용하며, 클레이튼 등에서 사용되지는 않지만 ECIES 라고 부르는 암호화 알고리듬을 사용할 수는 있습니다. 그러나 이 알고리듬을 현재 KAS 에서 지원하고 있지는 않습니다.

따라서 클레이든의 공개키로 암호화 하고 개인키로 복호화하는 것을 만들고 싶다면 키쌍을 직접 관리하고 ECIES 를 사용하는 방법을 쓴다면 가능할 것으로 보입니다.
그러나 이런 부분과 관련한 공식적인 문서는 KAS 에서 제공되는 바가 없는 부분은 양해부탁드리겠습니다.

감사합니다.

아하… 키쌍을 직접 생성하여 그 키쌍을 통해 클레이튼 계정을 생성하는 것이 가능하군요… 범위를 벗어난 질문이지만 키쌍을 직접 생성하는 방법을 어느 것을 참고해서 보면 될지 도움주시면 감사하겠습니다. 그리고 그 생성된 키쌍으로 클레이튼 계정을 생성하는 API도 알려주실 수 있을까요?

@ymkim Caver.js 문서 참고하시면 될거 같습니다.
문서에서 키 생성하는 부분에서 public, private key 가 나오게 되고요.
전송하는 예제도 같이 있습니다.

문서 검토해보았습니다. keyring을 이용하면 address와 privateKey가 제공되던데요~ 혹시 클레이튼에서는 address가 퍼블릭키와 동일한건가요? 이더리움에서는 address즉 account는 퍼블릭키를 가공하여 만들기 때문에 퍼블릭키와 address는 다른 개념으로 알고있어서요.

@_Luffy 답변해주시면 감사하겠습니다! address가 퍼블릭키가 맞을까요?
SingleKeyring {
_address: ‘0xa85ff65452d3191dce3017f2171eb4981c197887’,
_key: PrivateKey {
_privateKey: ‘0xd8dadc5c5edd8b6c92a8705cfa62428ac45f056f1ab7ca226bf8e68b5e9daca4’
}
}

안녕하세요, address 와 public key는 다릅니다.

이더리움에서 keccak(public key)에서 앞의 20바이트가 Address가 되듯이, 클레이튼에서도 기본 구조는 동일합니다.

다만 클레이튼에서는 추가적으로 address에 별도의 public key 할당이 가능하도록 설계되었습니다.

감사합니다.

@ymkim 안녕하십니까. @colin.kim 이 말씀주신대로 address, public key 는 조금 다른거고요.

키링에서 공개키를 얻기위해서는 caver.js keyring 문서 참고하시면 얻을수 있으실거에요~

@_Luffy 공유해주신 문서 잘 읽어 보았습니다. 덕분에 방법을 알게 되어 감사드립니다. 그런데 한 가지 의문인건 동일한 프라이빗키로 계정을 생성하면 address가 같게 나오고 심지어 원하는 address를 이용하여 생성하는 방법도 보았는데요. 이럴 경우에 블록체인내에 account의 address에 대한 중복이 발생하게 되는 것 아닌가요?

@ymkim 네, 맞습니다.
address 는 기본적으로 공개키로부터 파생되는 것이기 때문에 개인키가 동일하다면 동일한 주소를 가지게 되고요. 이런 문제를 암호학쪽에서는 key collision 문제로 정의하고 있어요.
일반적으로 개인키를 모르는 상태에서, 무작위로 생성하는 경우에 동일한 개인키가 생성될 가능성이 아주 낮은 확률이라고 보고 있고요.
이런걸 토대로 확률적으로 안정한 알고리듬의 구조라고 볼 수 있습니다.